tigeroser 发表于 2014-6-27 01:15:32

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

单独做个程序就正常,这是怎么回事
while(1)
           {
                  if(RI)                                     //查询---串口接收中断标志位
                  {          

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

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

1066950103 发表于 2014-6-27 01:44:28

建议你这样试试不发字符,发十六进制数据看看收到的和发送的数据有那些区别。

chqin1213 发表于 2014-6-27 08:05:02

循环发的话,收到的是不是bcdabcdabcd?

noley 发表于 2014-6-27 08:13:28

RI是接收完成的标志,为什么进去之后还要延时呢?

dlmaowf 发表于 2014-6-27 08:17:23

同问,为啥要加延时?

viq505 发表于 2014-6-27 10:46:42

对啊为什么要延时?

Godynono 发表于 2014-6-27 11:02:46

为什么加延时?

yy8047 发表于 2014-6-27 11:12:07

你是少收到1位还是最后一个字节啊,你是不是用的485或是连续这样调用啊

rockyyangyang 发表于 2014-6-27 14:45:35

管人家加不加延时

tigeroser 发表于 2014-6-27 14:48:26

chqin1213 发表于 2014-6-27 08:05
循环发的话,收到的是不是bcdabcdabcd?

是的 ,少了第一位

tigeroser 发表于 2014-6-27 14:50:11

chqin1213 发表于 2014-6-27 08:05
循环发的话,收到的是不是bcdabcdabcd?

正是这样 少了第一位

tigeroser 发表于 2014-6-27 14:52:29

dlmaowf 发表于 2014-6-27 08:17
同问,为啥要加延时?

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

dlmaowf 发表于 2014-6-27 15:01:12

51单片机么?这样写不太对吧

tigeroser 发表于 2014-6-27 15:18:02

dlmaowf 发表于 2014-6-27 15:01
51单片机么?这样写不太对吧

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

dlmaowf 发表于 2014-6-27 15:29:22

我一般是这样处理的
但我自己约定的协议一般是有起始字节和结束字节

tigeroser 发表于 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=0X00;
   }
   RxPoint=0;      //地址归零
}
main.c里面是
while(1)
         {
                  if(RI)                                       //查询---串口接收中断标志位
            {         

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

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

tigeroser 发表于 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

dlmaowf 发表于 2014-6-27 15:39:14

你写的程序,我有些看不懂

tigeroser 发表于 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=0X00;
   }
   RxPoint=0;      //地址归零
}
main()
{
          .......
       while(1)
         {
                  if(RI)                                       //查询---串口接收中断标志位
            {         

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

tigeroser 发表于 2014-6-27 15:56:20

tigeroser 发表于 2014-6-27 15:52
这是程序中的串口片断:
void Clear_RxBuf()
{


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

/*====================================问题==================================================
在中断中接收的字符是从tabl存入的,输出时从tabl能输出接收到的第一个字符,

但是上位机显示一个空格 若是从tabl输出则正常,字符串多一个位放\0所以要定义n+1位的数组?

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

dlmaowf 发表于 2014-6-27 16:07:08

可能我写程序的方式比较笨,都是一个字节一个字节收或者发的,但是好像没有遇到稀奇古怪的现象,写了很多的串口通讯了,没出现过问题

tigeroser 发表于 2014-6-27 16:40:37

问题依然存在,上位机什么也不发送时,单片机也能收到OD 0A回车换行

chqin1213 发表于 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=*这样的方法发送会不会出错?

tigeroser 发表于 2014-6-27 16:51:05

chqin1213 发表于 2014-6-27 16:44
我之前出现过这样的问题,你什么芯片?

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

chqin1213 发表于 2014-6-27 16:53:48

tigeroser 发表于 2014-6-27 16:51
STC89C52 ,并且还能无缘无故的接收 回车按键 郁闷

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

tigeroser 发表于 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存进去才行。
昨晚,第一位数据就会丢掉,现在解决了。

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

tigeroser 发表于 2014-6-27 16:59:27

chqin1213 发表于 2014-6-27 16:53
重新编辑了下,看下刚才发给你的,顺便问下。。。。你到底是发还是收。。。。。 ...

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

chqin1213 发表于 2014-6-27 17:00:52

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

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

tigeroser 发表于 2014-6-27 17:12:42

chqin1213 发表于 2014-6-27 17:00
发送16进制数据也会这样?

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

chqin1213 发表于 2014-6-27 17:23:32

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

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

tigeroser 发表于 2014-6-27 17:36:06

chqin1213 发表于 2014-6-27 17:23
就之前回复你的,我循环发送abcde,上位机收到bcdeabcdeabced。。。。。。

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

chqin1213 发表于 2014-6-28 14:00:09

tigeroser 发表于 2014-6-27 17:36
麻烦你看看之前你是怎么解决这个问题的。我当时出现这个 问题是把接收的数据从数组的第二位即RxBuf开 ...

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

rain73 发表于 2014-6-28 18:39:34

刚好我也在做这个芯片的串口通讯,纯中断和环型缓冲区的,完全没有问题。所以还需要在代码中找原因。

tigeroser 发表于 2014-6-28 23:05:17

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

好的 谢谢 我再看看代码
页: [1]
查看完整版本: 串口接收的数据怎么总是少一位