首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

上座机向单片机发送字符串

2013-10-15 
上位机向单片机发送字符串上位机向单片机发送一串字符串,存入一个数组缓冲区RX1_Buffer[COM_RX1_Lenth]中,

上位机向单片机发送字符串
上位机向单片机发送一串字符串,存入一个数组缓冲区RX1_Buffer[COM_RX1_Lenth]中,接下来单片机提取数组缓冲区中的一部分字符串,将该字符串转化为整形数据,接着将整形数据转化为十六进制数通过串口发送给上位机,单片机连续向上位机发送数据,上位机第一次能正确的接收到上位机发送给单片机的数据,过后上位机收到的数据就是错误的,不知道是什么原因,附部分程序代码如下:
void UART1_int (void) interrupt UART1_VECTOR
{
if(RI)

{
RI = 0;
if(COM1.B_RX_OK == 0)
{
if(COM1.RX_Cnt >= COM_RX1_Lenth) COM1.RX_Cnt = 0;
RX1_Buffer[COM1.RX_Cnt++] = SBUF;
COM1.RX_TimeOut = TimeOutSet1;
}

}
if(TI)
{
TI = 0;
if(COM1.TX_read != COM1.TX_write)
{
SBUF = TX1_Buffer[COM1.TX_read];
if(++COM1.TX_read >= COM_TX1_Lenth) COM1.TX_read = 0;
}
else COM1.B_TX_busy = 0;
}
}
void TX1_write2buff(u8 dat) //写入发送缓冲,指针+1
{
TX1_Buffer[COM1.TX_write] = dat; //装发送缓冲
if(++COM1.TX_write >= COM_TX1_Lenth) COM1.TX_write = 0;

if(COM1.B_TX_busy == 0)     //空闲
{  
    COM1.B_TX_busy = 1;     //标志忙
    TI = 1;                 //触发发送中断
}
}
void deal_uart(void)
{
if(RX1_Buffer[0]== 'R')

{
for(i=3;i<5;i++)
Y_arr[i-3] = RX1_Buffer[i];
t_year = strtod(Y_arr,NULL);
TAB_T[0] = DecToHex(t_year);

            for(i=6;i<8;i++)
                M_arr[i-6] =  RX1_Buffer[i];            
            t_month = strtod(M_arr,NULL);
             TAB_T[1] = DecToHex(t_month);
                for(i=9;i<11;i++)
            D_arr[i-9] =  RX1_Buffer[i];                
            t_day = strtod(D_arr,NULL);
             TAB_T[2] = DecToHex(t_day);

            for(i=12;i<14;i++)
                S_arr[i-12] =  RX1_Buffer[i];
            t_hour = strtod(S_arr,NULL);
             TAB_T[3] = DecToHex(t_hour);   
             COM1.RX_Cnt = 0; 
        }
}
void main(void)
{
while (1)
{
deal_uart();
for(i=0;i<4;i++)
TX1_write2buff(TAB_T[i]);
}
}

求原因? 

单片机 上位机 字符串 ?串口通信 buffer
[解决办法]
虽讲51是双工的,,实际上速度高些,同时发数据并接收数据51就出问题,STM32就没这个问题,
[解决办法]
这种情况单步调试一下应该会解决问题的 看看运行时各个变量 尤其是 COM1.TX_write和COM1.TX_read

有点乱
[解决办法]
大哥你这代码贴出来也太难看懂了,这是单片机端的代码?注释太少了。
建议你先让PC发一个字符试试看能不能成功,然后发两个字符,以此类推,不要一口气就一串字符,这样很难找出问题。
其次,要完整接受完一个字串,上位机的OnComm事件可能被触发多次,所以Buff和Index都需要用全局变量。然后每次收完了记得要初始化,否则再次接受的时候就容易出问题。
最后,关于你说的“将该字符串转化为整形数据,接着将整形数据转化为十六进制数通过串口发送给上位机”这句话我不太理解。一个数就是一个数,不管他是10机制还是16进制,他的值都是不变的,你已经将一个字符转成了整形了,怎么再将它转成16进制?为何不直接发回给上位机?感觉你在下位机做的事情是多此一举。。。

热点排行