打印

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

[复制链接]
楼主: klchang
手机看帖
扫描二维码
随时随地手机跟帖
21
手倒没啥问题,小毛病而已。你现在去读你的程序,想想第3个数为什么出现问题,记住串口发送的先后顺序是确定的,出现这种问题,肯定是程序在内存分配上出现了混乱。你可以先在发送缓冲区里写死3个数据,看发送是否出错,把接收发送两边的问题分离开。

使用特权

评论回复
22
xinxi| | 2011-11-9 17:04 | 只看该作者
搞个 汇编 很方便,c看不懂

使用特权

评论回复
23
klchang|  楼主 | 2011-11-9 17:12 | 只看该作者
回19楼:
请教ayb_ice前辈,那如何才算是真正的发送和接收缓冲区分开?

使用特权

评论回复
24
NE5532| | 2011-11-9 17:13 | 只看该作者
分开定义就是了,接收到的数据考到发送缓冲里再发送。

使用特权

评论回复
25
klchang|  楼主 | 2011-11-9 17:31 | 只看该作者
我的定义如下:
uchar r_buf[3]={0x20,0x11,0x00};
显示图片如下,可以说明固定字节发应该无问题:

使用特权

评论回复
26
klchang|  楼主 | 2011-11-9 17:35 | 只看该作者
由于公司距我家(家中无网)较远,我先走了,明天继续,期待着更多的答复。

使用特权

评论回复
27
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你这样试试,不知道行不行

使用特权

评论回复
28
NE5532| | 2011-11-9 21:33 | 只看该作者
那很应该怀疑接收问题,严重考虑数组溢出问题。

使用特权

评论回复
29
lampfire| | 2011-11-9 22:12 | 只看该作者
看结果 电脑接收的第一个字节是发送的最后一个字节   显然是最后接收的字节 还在BUFF里 发送前先清除之

使用特权

评论回复
30
klchang|  楼主 | 2011-11-10 07:52 | 只看该作者
本帖最后由 klchang 于 2011-11-10 07:54 编辑

回27楼pineapple2009:
          我试过了,我只是字节数改为3,即r_count==3,问题依旧.

使用特权

评论回复
31
klchang|  楼主 | 2011-11-10 07:59 | 只看该作者
回28楼:
我已经使用如下语句加以限制:
if(r_count==3)    /*判断是否要置r_finished标志*/
{
      r_finished=1;
      r_count=0;  //r_count为数组的字符个数
}
那么,数组是如何溢出的呢?

使用特权

评论回复
32
klchang|  楼主 | 2011-11-10 08:08 | 只看该作者
回29楼:
“BUFF里 发送前先清除之”
是把SBUF清0,再把发送的值赋给SBUF?如果这样,好像与发送的值直接赋给SBUF没什么区别。

使用特权

评论回复
33
pineapple2009| | 2011-11-10 08:10 | 只看该作者
LZ,我的意思不是发送固定字节数据,是发送6个,但是中间由a转了一下。。。

使用特权

评论回复
34
klchang|  楼主 | 2011-11-10 08:36 | 只看该作者
回33楼:
我没有发送固定字节的数据,我只是收发的字节数改为3,即串口发,串口收。

使用特权

评论回复
35
klchang|  楼主 | 2011-11-10 09:11 | 只看该作者
谢谢各位的帮助!
问题已解决。
原因是我使用的STC单片机,使用USB转串口下载程序,下载程序后,我没有重新上电,直接进行串口测试,而出现上述问题。

备注:我写的程序本身无问题,27楼程序可供参考。

使用特权

评论回复
36
highgear| | 2011-11-10 10:21 | 只看该作者
赞NE5532,让人敬佩!

我一看到大段的程序,就失去了耐心,而 NE5532 手臂带伤仍然热心解答问题, 这样的好人太难得了。

使用特权

评论回复
37
NE5532| | 2011-11-10 10:37 | 只看该作者
楼主,你的问题不是在没有重新上电,程序有问题。单片机下程序以后肯定是复位了的,如果你说没上电导致问题,那肯定是你程序的初始化里没有对缓冲区初始化,定义变量不初始化是大忌。不过恭喜你找到问题所在!

使用特权

评论回复
38
klchang|  楼主 | 2011-11-10 12:45 | 只看该作者
谢谢NE5532指点!
但如何在程序的初始化时对缓冲区初始化?是把缓冲区r_buf[6]的初值全都设置为0吗?

使用特权

评论回复
39
icecut| | 2011-11-10 13:09 | 只看该作者
ne5532也会忽悠人啊.都忽悠2页了,没什么进展.

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

你这种问题太正确了.如果发送过程中错一个bit,那就丢一个字节,然后全串了

使用特权

评论回复
40
murex| | 2011-11-10 13:22 | 只看该作者
开中断之前清一下RI

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则