请教:简单的带缓冲的串口程序问题

[复制链接]
8757|68
NE5532 发表于 2011-11-9 17:04 | 显示全部楼层
手倒没啥问题,小毛病而已。你现在去读你的程序,想想第3个数为什么出现问题,记住串口发送的先后顺序是确定的,出现这种问题,肯定是程序在内存分配上出现了混乱。你可以先在发送缓冲区里写死3个数据,看发送是否出错,把接收发送两边的问题分离开。
xinxi 发表于 2011-11-9 17:04 | 显示全部楼层
搞个 汇编 很方便,c看不懂
 楼主| klchang 发表于 2011-11-9 17:12 | 显示全部楼层
回19楼:
请教ayb_ice前辈,那如何才算是真正的发送和接收缓冲区分开?
NE5532 发表于 2011-11-9 17:13 | 显示全部楼层
分开定义就是了,接收到的数据考到发送缓冲里再发送。
 楼主| klchang 发表于 2011-11-9 17:31 | 显示全部楼层
我的定义如下:
uchar r_buf[3]={0x20,0x11,0x00};
显示图片如下,可以说明固定字节发应该无问题:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| klchang 发表于 2011-11-9 17:35 | 显示全部楼层
由于公司距我家(家中无网)较远,我先走了,明天继续,期待着更多的答复。
pineapple2009 发表于 2011-11-9 21:30 | 显示全部楼层
void serial()interrupt 4 using 1
{
if(RI)
{
     a=sbuf;
     r_buf[r_count]=a;        /*接收*/
     RI=0;                     /*淸标志*/
     r_count++;                  /*下标+1*/
     if(r_count==6)    /*判断是否要置r_finished标志*/
  {
   r_finished=1;
   r_count=0;
  }
}

LZ你这样试试,不知道行不行
NE5532 发表于 2011-11-9 21:33 | 显示全部楼层
那很应该怀疑接收问题,严重考虑数组溢出问题。
lampfire 发表于 2011-11-9 22:12 | 显示全部楼层
看结果 电脑接收的第一个字节是发送的最后一个字节   显然是最后接收的字节 还在BUFF里 发送前先清除之
 楼主| klchang 发表于 2011-11-10 07:52 | 显示全部楼层
本帖最后由 klchang 于 2011-11-10 07:54 编辑

回27楼pineapple2009:
          我试过了,我只是字节数改为3,即r_count==3,问题依旧.
 楼主| klchang 发表于 2011-11-10 07:59 | 显示全部楼层
回28楼:
我已经使用如下语句加以限制:
if(r_count==3)    /*判断是否要置r_finished标志*/
{
      r_finished=1;
      r_count=0;  //r_count为数组的字符个数
}
那么,数组是如何溢出的呢?
 楼主| klchang 发表于 2011-11-10 08:08 | 显示全部楼层
回29楼:
“BUFF里 发送前先清除之”
是把SBUF清0,再把发送的值赋给SBUF?如果这样,好像与发送的值直接赋给SBUF没什么区别。
pineapple2009 发表于 2011-11-10 08:10 | 显示全部楼层
LZ,我的意思不是发送固定字节数据,是发送6个,但是中间由a转了一下。。。
 楼主| klchang 发表于 2011-11-10 08:36 | 显示全部楼层
回33楼:
我没有发送固定字节的数据,我只是收发的字节数改为3,即串口发,串口收。
 楼主| klchang 发表于 2011-11-10 09:11 | 显示全部楼层
谢谢各位的帮助!
问题已解决。
原因是我使用的STC单片机,使用USB转串口下载程序,下载程序后,我没有重新上电,直接进行串口测试,而出现上述问题。

备注:我写的程序本身无问题,27楼程序可供参考。
highgear 发表于 2011-11-10 10:21 | 显示全部楼层
赞NE5532,让人敬佩!

我一看到大段的程序,就失去了耐心,而 NE5532 手臂带伤仍然热心解答问题, 这样的好人太难得了。
NE5532 发表于 2011-11-10 10:37 | 显示全部楼层
楼主,你的问题不是在没有重新上电,程序有问题。单片机下程序以后肯定是复位了的,如果你说没上电导致问题,那肯定是你程序的初始化里没有对缓冲区初始化,定义变量不初始化是大忌。不过恭喜你找到问题所在!
 楼主| klchang 发表于 2011-11-10 12:45 | 显示全部楼层
谢谢NE5532指点!
但如何在程序的初始化时对缓冲区初始化?是把缓冲区r_buf[6]的初值全都设置为0吗?
icecut 发表于 2011-11-10 13:09 | 显示全部楼层
ne5532也会忽悠人啊.都忽悠2页了,没什么进展.

记住:超过1个字节的通信都要封包.建议看看串口通信那些协议.
起始字节,字节长度,data[],校验和.
然后去同步去解析,这样才不会串....如果出错,请求重发....

你这种问题太正确了.如果发送过程中错一个bit,那就丢一个字节,然后全串了
murex 发表于 2011-11-10 13:22 | 显示全部楼层
开中断之前清一下RI
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部