串口通讯问题

时间:2021-02-10 17:57:15
近来调试一程序,目标是在某设备(主控板MCU)接收到PC发送的数据后,进行相应处理,而后将处理后的数据发送到该PC,也就是串口的接收和发送过程.
    
实践证明,设备的接收过程可以实现,但是发送过程存在问题:
    如果在发送中断处设置断点,并且单步执行程序,串口调试工具COMTOOL显示接收到的数据有16个字节(期望的);
    如果不设置断点,让程序一下子跑完,则串口调试工具COMTOOL显示接收到的数据只有9个字节,从09字节开始,后面的7个数据全部丢失(不知道是否确实丢失,但是COMTOOL中只显示9个字节的数据)

上面的问题已困扰本人很久了,一直不知道是什么原因会产生这样的现象,所以请各位指点迷津,谢谢

24 个解决方案

#1


设备上的接收程序有问题,可能串口中断被其他中断干扰。可将串口中断设为高优先级,其他的中断设位低优先

#2


中断的单步执行与顺序执行有什么区别吗

#3


拨特率 呢

#4


波特率是不是有偏差

#5


适当的nop

#6


波特率适当低一些加上延时,调通以后再增加波特率。

#7


你的波特率和电脑的波特率都一致吗?如果不一致,是会丢失数据的,如果你设断点,一个一个传送,所以没问题,如果连续传送,后面的数据可能会丢失。软件问题吧。

#8


PC上设置的波特率同软件设置的波特率一致,都是9600,真郁闷,没有进展

#9


我以前也碰到过类似问题,mcu发发给PC,一般发一遍的话有误码,连续发3次,试试.
PC 那边的接受中断 字长改得稍长一点

#10


MCU到PC我到是没怎么碰到误码,我用的是查询方式发的

很可靠哈...

你们那出了问题会不会跟电平转换电路有关呢?

#11


LZ把串口中断程序贴出来看看。 你接收的时候可以这样: 中断进入后,关中断,如果收到帧头后,查询接收完剩下的数据,接收完后,设标志位,检测到标志位后,再把整个数组发给串口就行了,出中断程序时记得打开中断就可以了。波特率一致,这样不会有问题。

#12


示波器显示有数据流通,而且电平是对的,在MCU端为5v的电平,PC端为15v左右的电平;
查询方式是什么样的,中断方式又是如何运行的呢
我将接收函数放在主函数的while(1)中,当有数据来到时,进入接收中断,然后处理数据,最后将处理后的数据发送出去,这样算是查询还是中断?

#13


那当然有问题了,你哪是用中断,不能乱说的。你这个程序当然有问题,你这样连续发送当然有问题,你连续放松那边来不及送的。当然会丢失数据的。你每发送一个数据之后等待一点时间。

#14


LZ你把程序贴出来看看就知道了。空谈没有实际效果。 你先看看书上的查询接收和中断接收部分的例子。 51的很好控制的。

#15


***************************************************************************
             
电子研发工程师交流群:25262298
          
***************************************************************************

#16


搞不明白了,将发送中断程序贴出来,希望大家多多交流.
主要问题:发送中断处如果设置断点,并单步执行,则PC端显示接收到期望的16个字节的数据;
         发送中断处如果不设置断点,则PC端显示接收到SCI_buffer_data_tr[]数组的前9个数据(用示波器打过了,这时只有九个字节的数据量)

上面问题已困扰我很久了,一直没有找到解决办法,我一直相信集体的力量是无穷的,所以大家研究研究哈

@interrupt void SCI_int(void)
{
   //发送中断处理函数,波特率=9600BPS
  if(ValBit(SCISR,7)) //判断发送寄存器是否为空,如果空  
  {
      if((++SCI_data_pointer_tr)>SCI_BUF_NUM)    //SCI_BUF_NUM=15
      {
           SCIDR=SCI_buffer_data_tr[SCI_data_pointer_tr-1].byte;
           SCICR2=0x00; //停止UART功能

      }
      else
      {
           SCIDR=SCI_buffer_data_tr[SCI_data_pointer_tr-1].byte;
 //以下两句于11.17日加入,目的是每次发送数据后都延时一段时间;
            _asm("nop\n");
            _asm("nop\n");
       }       
    }
}

#17


此处有一个单片机爱好者的群,欢迎高手,初学者加入.

单片机爱好者:33130145

#18


如果你在if中设置断点,然后全速执行,是否能进入该中断?然后你在最后停的UART是通讯还是中断,如果是通讯,你全速执行肯定会有最后一个数据收不到的,至于原因后面再给你说明。

#19


一点点调试啊,比如说你全速执行,将SCI_BUF_NUM设成9可以吗?10可以吗?一点点找原因,就这么一段代码,前提条件和其他的相关信息都不知道,怎么帮你呢?我们自己都摸不着头脑。
要么在把代码详细一点,要么把你测试的过程详细一点,不知道你的方法对吗?你发送的数据是什么?

#20


同意风云说法。先写简单点的,再慢慢增加

#21


MX232在PC端的电压应该是-10V吧,我检测3脚(公头发送)是-10V,但是2脚(公头接收)为-4.9V,是不是电压有问题啊

#22


近来调试一程序,目标是在某设备(主控板MCU)接收到PC发送的数据后,进行相应处理,而后将处理后的数据发送到该PC,也就是串口的接收和发送过程.
    
实践证明,设备的接收过程可以实现,但是发送过程存在问题:
    如果在发送中断处设置断点,并且单步执行程序,串口调试工具COMTOOL显示接收到的数据有16个字节(期望的);
    如果不设置断点,让程序一下子跑完,则串口调试工具COMTOOL显示接收到的数据只有9个字节,从09字节开始,后面的7个数据全部丢失(不知道是否确实丢失,但是COMTOOL中只显示9个字节的数据)

上面的问题已困扰本人很久了,一直不知道是什么原因会产生这样的现象,所以请各位指点迷津,谢谢

#23


前面接收到的9Byte的值对吗?如果9BYTE的值都对不上的话,查波特率?

#24


谢谢各位的关心,经过一段时间的郁闷,重新理顺一下思路,然后发现模块出现了问题,经过更换调试好的模块后,程序顺利通过,感觉学到不少东西啊,在网上也接触到不少热心人,再次感谢

#1


设备上的接收程序有问题,可能串口中断被其他中断干扰。可将串口中断设为高优先级,其他的中断设位低优先

#2


中断的单步执行与顺序执行有什么区别吗

#3


拨特率 呢

#4


波特率是不是有偏差

#5


适当的nop

#6


波特率适当低一些加上延时,调通以后再增加波特率。

#7


你的波特率和电脑的波特率都一致吗?如果不一致,是会丢失数据的,如果你设断点,一个一个传送,所以没问题,如果连续传送,后面的数据可能会丢失。软件问题吧。

#8


PC上设置的波特率同软件设置的波特率一致,都是9600,真郁闷,没有进展

#9


我以前也碰到过类似问题,mcu发发给PC,一般发一遍的话有误码,连续发3次,试试.
PC 那边的接受中断 字长改得稍长一点

#10


MCU到PC我到是没怎么碰到误码,我用的是查询方式发的

很可靠哈...

你们那出了问题会不会跟电平转换电路有关呢?

#11


LZ把串口中断程序贴出来看看。 你接收的时候可以这样: 中断进入后,关中断,如果收到帧头后,查询接收完剩下的数据,接收完后,设标志位,检测到标志位后,再把整个数组发给串口就行了,出中断程序时记得打开中断就可以了。波特率一致,这样不会有问题。

#12


示波器显示有数据流通,而且电平是对的,在MCU端为5v的电平,PC端为15v左右的电平;
查询方式是什么样的,中断方式又是如何运行的呢
我将接收函数放在主函数的while(1)中,当有数据来到时,进入接收中断,然后处理数据,最后将处理后的数据发送出去,这样算是查询还是中断?

#13


那当然有问题了,你哪是用中断,不能乱说的。你这个程序当然有问题,你这样连续发送当然有问题,你连续放松那边来不及送的。当然会丢失数据的。你每发送一个数据之后等待一点时间。

#14


LZ你把程序贴出来看看就知道了。空谈没有实际效果。 你先看看书上的查询接收和中断接收部分的例子。 51的很好控制的。

#15


***************************************************************************
             
电子研发工程师交流群:25262298
          
***************************************************************************

#16


搞不明白了,将发送中断程序贴出来,希望大家多多交流.
主要问题:发送中断处如果设置断点,并单步执行,则PC端显示接收到期望的16个字节的数据;
         发送中断处如果不设置断点,则PC端显示接收到SCI_buffer_data_tr[]数组的前9个数据(用示波器打过了,这时只有九个字节的数据量)

上面问题已困扰我很久了,一直没有找到解决办法,我一直相信集体的力量是无穷的,所以大家研究研究哈

@interrupt void SCI_int(void)
{
   //发送中断处理函数,波特率=9600BPS
  if(ValBit(SCISR,7)) //判断发送寄存器是否为空,如果空  
  {
      if((++SCI_data_pointer_tr)>SCI_BUF_NUM)    //SCI_BUF_NUM=15
      {
           SCIDR=SCI_buffer_data_tr[SCI_data_pointer_tr-1].byte;
           SCICR2=0x00; //停止UART功能

      }
      else
      {
           SCIDR=SCI_buffer_data_tr[SCI_data_pointer_tr-1].byte;
 //以下两句于11.17日加入,目的是每次发送数据后都延时一段时间;
            _asm("nop\n");
            _asm("nop\n");
       }       
    }
}

#17


此处有一个单片机爱好者的群,欢迎高手,初学者加入.

单片机爱好者:33130145

#18


如果你在if中设置断点,然后全速执行,是否能进入该中断?然后你在最后停的UART是通讯还是中断,如果是通讯,你全速执行肯定会有最后一个数据收不到的,至于原因后面再给你说明。

#19


一点点调试啊,比如说你全速执行,将SCI_BUF_NUM设成9可以吗?10可以吗?一点点找原因,就这么一段代码,前提条件和其他的相关信息都不知道,怎么帮你呢?我们自己都摸不着头脑。
要么在把代码详细一点,要么把你测试的过程详细一点,不知道你的方法对吗?你发送的数据是什么?

#20


同意风云说法。先写简单点的,再慢慢增加

#21


MX232在PC端的电压应该是-10V吧,我检测3脚(公头发送)是-10V,但是2脚(公头接收)为-4.9V,是不是电压有问题啊

#22


近来调试一程序,目标是在某设备(主控板MCU)接收到PC发送的数据后,进行相应处理,而后将处理后的数据发送到该PC,也就是串口的接收和发送过程.
    
实践证明,设备的接收过程可以实现,但是发送过程存在问题:
    如果在发送中断处设置断点,并且单步执行程序,串口调试工具COMTOOL显示接收到的数据有16个字节(期望的);
    如果不设置断点,让程序一下子跑完,则串口调试工具COMTOOL显示接收到的数据只有9个字节,从09字节开始,后面的7个数据全部丢失(不知道是否确实丢失,但是COMTOOL中只显示9个字节的数据)

上面的问题已困扰本人很久了,一直不知道是什么原因会产生这样的现象,所以请各位指点迷津,谢谢

#23


前面接收到的9Byte的值对吗?如果9BYTE的值都对不上的话,查波特率?

#24


谢谢各位的关心,经过一段时间的郁闷,重新理顺一下思路,然后发现模块出现了问题,经过更换调试好的模块后,程序顺利通过,感觉学到不少东西啊,在网上也接触到不少热心人,再次感谢