搜索
bottom↓
回复: 33

串口接收的数据怎么总是少一位

[复制链接]

出0入0汤圆

发表于 2014-6-27 01:15:32 | 显示全部楼层 |阅读模式
单独做个程序就正常,这是怎么回事
while(1)
           {
                  if(RI)                                       //查询---串口接收中断标志位
                  {          

                          delay_ms(1000);        //延时---等待串口接收完成
                          Print_Str(RxBuf);                  
                          RI=0;
                  }

这是main里面的一个循环体,现象是
上位机发送一个abcd,但在while里面单片机向上位机发送bcd还换行。
要是单独做个小程序,在这就不会出错。
这是什么问题呢,都一样的程序

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2014-6-27 01:44:28 | 显示全部楼层
建议你这样试试不发字符,发十六进制数据看看收到的和发送的数据有那些区别。

出0入0汤圆

发表于 2014-6-27 08:05:02 | 显示全部楼层
循环发的话,收到的是不是bcdabcdabcd?

出0入0汤圆

发表于 2014-6-27 08:13:28 | 显示全部楼层
RI是接收完成的标志,为什么进去之后还要延时呢?

出0入0汤圆

发表于 2014-6-27 08:17:23 | 显示全部楼层
同问,为啥要加延时?

出0入0汤圆

发表于 2014-6-27 10:46:42 | 显示全部楼层
对啊为什么要延时?

出0入0汤圆

发表于 2014-6-27 11:02:46 | 显示全部楼层
为什么加延时?

出0入0汤圆

发表于 2014-6-27 11:12:07 | 显示全部楼层
你是少收到1位还是最后一个字节啊,你是不是用的485或是连续这样调用啊

出0入0汤圆

发表于 2014-6-27 14:45:35 | 显示全部楼层
管人家加不加延时

出0入0汤圆

 楼主| 发表于 2014-6-27 14:48:26 | 显示全部楼层
chqin1213 发表于 2014-6-27 08:05
循环发的话,收到的是不是bcdabcdabcd?

是的 ,少了第一位

出0入0汤圆

 楼主| 发表于 2014-6-27 14:50:11 | 显示全部楼层
chqin1213 发表于 2014-6-27 08:05
循环发的话,收到的是不是bcdabcdabcd?

正是这样 少了第一位

出0入0汤圆

 楼主| 发表于 2014-6-27 14:52:29 | 显示全部楼层
dlmaowf 发表于 2014-6-27 08:17
同问,为啥要加延时?

上位发送的是任意字符串延时一段时间让单片机接收完

出0入0汤圆

发表于 2014-6-27 15:01:12 | 显示全部楼层
51单片机么?这样写不太对吧

出0入0汤圆

 楼主| 发表于 2014-6-27 15:18:02 | 显示全部楼层
dlmaowf 发表于 2014-6-27 15:01
51单片机么?这样写不太对吧

是的 51,上位机发送的数据不带有结束标志信息,也可能带有回车。但长度有限。现在的处理办法是建立一个大点的数组,把数据接收进来,然后判断有用的

出0入0汤圆

发表于 2014-6-27 15:29:22 | 显示全部楼层
我一般是这样处理的
但我自己约定的协议一般是有起始字节和结束字节

出0入0汤圆

 楼主| 发表于 2014-6-27 15:31:19 | 显示全部楼层
tigeroser 发表于 2014-6-27 15:18
是的 51,上位机发送的数据不带有结束标志信息,也可能带有回车。但长度有限。现在的处理办法是建立一个 ...

void Clear_RxBuf()
{
   unsigned char j=0;
   RxPoint=0;
   for(  ;j<Rx_N;j++)
   {
       RxBuf[RxPoint++]=0X00;
   }
   RxPoint=0;      //地址归零
}
main.c里面是
while(1)
           {
                  if(RI)                                       //查询---串口接收中断标志位
            {         

                          delay_ms(1000);        //延时---等待串口接收完成
                  Print_Str(RxBuf);   
                          Clear_RxBuf               
                          RI=0;
                  }
      }

按上面的说法,发一个A,但十六进行显示是一个A后面6个回车(ODOA)

出0入0汤圆

 楼主| 发表于 2014-6-27 15:33:56 | 显示全部楼层
tigeroser 发表于 2014-6-27 15:31
void Clear_RxBuf()
{
   unsigned char j=0;

发送大写A
接收十六进制显示是
41 0D 0A 0D 0A 0D 0A 0D 0A 0D 0A 0D 0A

出0入0汤圆

发表于 2014-6-27 15:39:14 | 显示全部楼层
你写的程序,我有些看不懂

出0入0汤圆

 楼主| 发表于 2014-6-27 15:52:47 | 显示全部楼层
dlmaowf 发表于 2014-6-27 15:39
你写的程序,我有些看不懂

这是程序中的串口片断:
void Clear_RxBuf()
{
   unsigned char j=0;
   RxPoint=0;
   for(  ;j<Rx_N;j++)
   {
       RxBuf[RxPoint++]=0X00;
   }
   RxPoint=0;      //地址归零
}
main()
{
          .......
       while(1)
           {
                  if(RI)                                       //查询---串口接收中断标志位
            {         

                          delay_ms(1000);        //延时---等待串口接收完成
                  Print_Str(RxBuf);   //
                          Clear_RxBuf               
                          RI=0;
                 }
                else;
主程序中等待串口中断,接收到不同的内容执行不同的操作,这里用Print_Str(RxBuf);  代替(因为操作不对)
如果我用个收发标志位,如以*开始,以#结束,就正常,上面的程序会输出6个回车0D0A.不知怎么回事

出0入0汤圆

 楼主| 发表于 2014-6-27 15:56:20 | 显示全部楼层
tigeroser 发表于 2014-6-27 15:52
这是程序中的串口片断:
void Clear_RxBuf()
{

找到了我以前写的一个关于串口接收字符串的例程

/*====================================问题==================================================
  在中断中接收的字符是从tabl[0]存入的,输出时从tabl[0]能输出接收到的第一个字符,
  
  但是上位机显示一个空格 若是从tabl[1]输出则正常,字符串多一个位放\0所以要定义n+1位的数组?

  复位时才能接收数据  不是初始化液晶的问题
  =========================================================================================*/

出0入0汤圆

发表于 2014-6-27 16:07:08 | 显示全部楼层
可能我写程序的方式比较笨,都是一个字节一个字节收或者发的,但是好像没有遇到稀奇古怪的现象,写了很多的串口通讯了,没出现过问题

出0入0汤圆

 楼主| 发表于 2014-6-27 16:40:37 | 显示全部楼层
问题依然存在,上位机什么也不发送时,单片机也能收到OD 0A回车换行

出0入0汤圆

发表于 2014-6-27 16:44:11 | 显示全部楼层
本帖最后由 chqin1213 于 2014-6-27 16:50 编辑
tigeroser 发表于 2014-6-27 14:48
是的 ,少了第一位


我之前出现过这样的问题,51的话。。。。具体解决办法我忘记啦,我说一些零碎的可能原因,你挨个试下。。。。。嘿嘿
1,使用printf函数时,TI置位复位问题(如果没使用这个函数可以忽略)。2,串口初始化看下。3,你试下单纯使用printf函数或sbuf=*这样的方法发送会不会出错?

出0入0汤圆

 楼主| 发表于 2014-6-27 16:51:05 | 显示全部楼层
chqin1213 发表于 2014-6-27 16:44
我之前出现过这样的问题,你什么芯片?

STC89C52 ,并且还能无缘无故的接收 回车按键 郁闷

出0入0汤圆

发表于 2014-6-27 16:53:48 | 显示全部楼层
tigeroser 发表于 2014-6-27 16:51
STC89C52 ,并且还能无缘无故的接收 回车按键 郁闷

重新编辑了下,看下刚才发给你的,顺便问下。。。。你到底是发还是收。。。。。

出0入0汤圆

 楼主| 发表于 2014-6-27 16:57:53 | 显示全部楼层
chqin1213 发表于 2014-6-27 16:44
我之前出现过这样的问题,51的话。。。。具体解决办法我忘记啦,我说一些零碎的可能原因,你挨个试下。。 ...

1---没用printf语句,但在51上用过,方法是在网上看的,先ES=0;TI=1强制TI置1,且关中断,因为printf发送的是字符串。
2---初始化没问题的
3---要是在收发的数据前后加个标志,没问题,我之前做和程序也是:以*开头。*前面的都在SBUF中覆盖掉了。

看了以前写的1602程序,接收的字符串要从第一位即Rxbuf[1]存进去才行。
昨晚,第一位数据就会丢掉,现在解决了。

现在是串口助手发送字符 字符串时,单片机都会接收到0D 0A 也不知道怎么搞的。用M3时都没发现这问题,难道是单片机问题?

出0入0汤圆

 楼主| 发表于 2014-6-27 16:59:27 | 显示全部楼层
chqin1213 发表于 2014-6-27 16:53
重新编辑了下,看下刚才发给你的,顺便问下。。。。你到底是发还是收。。。。。 ...

上位机发任意信息:字符或者字符串,单片机收。之后判断接收的信息是否有用,----即解析字符串内容

出0入0汤圆

发表于 2014-6-27 17:00:52 | 显示全部楼层
tigeroser 发表于 2014-6-27 16:57
1---没用printf语句,但在51上用过,方法是在网上看的,先ES=0;TI=1强制TI置1,且关中断,因为printf发送 ...

发送16进制数据也会这样?

出0入0汤圆

 楼主| 发表于 2014-6-27 17:12:42 | 显示全部楼层
chqin1213 发表于 2014-6-27 17:00
发送16进制数据也会这样?

是的 接收也是用16进制显示的  才能看到是回车0D 0A 你之前遇到的是什么问题

出0入0汤圆

发表于 2014-6-27 17:23:32 | 显示全部楼层
tigeroser 发表于 2014-6-27 17:12
是的 接收也是用16进制显示的  才能看到是回车0D 0A 你之前遇到的是什么问题 ...

就之前回复你的,我循环发送abcde,上位机收到bcdeabcdeabced。。。。。。

出0入0汤圆

 楼主| 发表于 2014-6-27 17:36:06 | 显示全部楼层
chqin1213 发表于 2014-6-27 17:23
就之前回复你的,我循环发送abcde,上位机收到bcdeabcdeabced。。。。。。

麻烦你看看之前你是怎么解决这个问题的。我当时出现这个 问题是把接收的数据从数组的第二位即RxBuf[1]开始存储的,这样就解决了

出0入0汤圆

发表于 2014-6-28 14:00:09 | 显示全部楼层
tigeroser 发表于 2014-6-27 17:36
麻烦你看看之前你是怎么解决这个问题的。我当时出现这个 问题是把接收的数据从数组的第二位即RxBuf[1]开 ...

由于问题过去很久,当时我也没记录解决办法,可能的原因就是printf函数中的TI问题。。。。。。。

出0入0汤圆

发表于 2014-6-28 18:39:34 | 显示全部楼层
刚好我也在做这个芯片的串口通讯,纯中断和环型缓冲区的,完全没有问题。所以还需要在代码中找原因。

出0入0汤圆

 楼主| 发表于 2014-6-28 23:05:17 | 显示全部楼层
rain73 发表于 2014-6-28 18:39
刚好我也在做这个芯片的串口通讯,纯中断和环型缓冲区的,完全没有问题。所以还需要在代码中找原因。 ...

好的 谢谢 我再看看代码
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 03:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表