欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

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

更新时间: 2014-01-05 03:14:53 责任编辑: Author_N1

 

上位机向单片机发送字符串
上位机向单片机发送一串字符串,存入一个数组缓冲区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]);
}
}

求原因? 


--参考方法--
虽讲51是双工的,,实际上速度高些,同时发数据并接收数据51就出问题,STM32就没这个问题,
--参考方法--
这种情况单步调试一下应该会解决问题的 看看运行时各个变量 尤其是 COM1.TX_write和COM1.TX_read

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

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 03:14:53
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/20051/
本文WWW.DOC100.NET DOC100.NET版权所有。