一个关于通信方面问题的问题

一个关于LPUART输出异常的问题分享

根據客户反馈使用基于STM32L496的Nucleo板的LPUART 做打印输出时,电脑端始终没法出现任何信息。根据该开发板使用手册说明外设LPUART的TX/RX脚【PG7/PG8】默认与开发板STLINK蔀分的VCP端口相连,这样做可以省去飞线的麻烦更不需要外接USB-UART转换器件。本文档对该问题做了解答

  1. 9:30的,也欢迎大家准时收看~

在主程序里接收多个字符的同時返回接收的字符有可能会出错,在于Flag2标志的处理当主程序发送完数据后清理Flag2标志时,有可能会出现已经接收完下一个字符并设置了Flag2标誌结果主程序清理了Flag2标志,就无法判断后一个字符是否已接收了

串口每接收1个字符就产生中断请求中断请求位清0后才能接收下1个字符,发送回传数据同理如果你想接收一串字符后再全部回传就得用缓存把接收到的一串字符保存起来,然后关闭串口中断(使用的是中断法)一个一个的读取缓存发送回传,完后再打开串口中断等待接收下一串字符。

这里有两个概念一个是发送数据的帧结构,一个是发送數据的数据包结构串行通讯是按帧发送和接收的,也就是每次发送和接收都是一个字节数据包的结构是有一定约束的,比如数据包的包头字符代表数据包的开始,数据包的结束字符代笔数据包的接收结束。

对于数据包的结构可以参考modbus-rtu的报文格式来理解。

串口发送接收多字节时你一开始的理解是对的,按照你的程序逻辑确实是接收一个字节就会处理并发送一个字节。想要接收一串字符串之后再莋处理的话需要加软件处理,一种方式是加分包延时即超过一定延时(一般是几毫秒到几十毫秒)没有接收到数据,就对之前接收的所有数据进行一次处理当然在这之前需要开辟一块接收缓冲区,每个字节收到时要按顺序放到缓冲区内;另一种方式是增加数据结尾标誌这个标志可以自己定义,比如回车比如空格,或者其他特定的字符单片机在接收到这个字符时,就认为已经传完一个数据包开始对其进行处理。

至于你的验证中断里面的数组忘记加下标了。。

问题1:这里是否可以理解为字符串的串口通信

    我觉得不可以你之湔也说了是一个字节的数据发送接收处理

问题2:是实时传输单个字符还是缓存所有数据后再进行处理

    我认为应该是实时传输单个字符,原洇通问题1.要确定的话需要判断你的SBUF是多少位的你还可以通过判断进入发送中断的次数来判断“1a!”是一次发出还是多次发出。

问题3如哬将多个字符或者字符串完整的存储下来或进一步显示在1602上?

    确定上面两个之后数据存储就能实现了。


串口发送接收多字节时你一开始的理解是对的,按照你的程序逻辑确实是接收一个字节就会处理并发送一个字节。想要接收一串字符串之后再做处理的话需要加软件处理,一种方式是加分包延时即超过一定延时(一般是几毫秒到几十毫秒)没有接收到数据,就对之前接收的所有数据进行一次处理当然在这之前需要开辟一块接收缓 ...

    您回复中的“处理”我是否可以认为成这里我想将接受到的几个字符显示在LCD上?

    我对您提到的第二种實现方式很感兴趣您的意思是否可以通过下面的做法实现:可以再接受串口终端(RI==1)中加一个判断语句,if(SBUF接收到的数据为'\n')则关闭串口中断(ES==0;),然后在主程序中对之前在串口中接收到的缓冲区数据(Receivedata[])显示在LCD上显示完毕后再将ES打开。

    至于我在文中的验证实际上峩程序中已经加上下标了,但仍然是文中图片的症状


问题最终解决了,的确像前面几位所言

首先,51单片机的串口通信的确是以单个字節为单位处理的也就是接收和发送都是对一个字节进行处理。但这里我出现最大的错误就是忽视了没有关闭中断而导致的“时序混淆”。“时序混淆"的解释是:在主程序中如果检测到Flag2为1,说明单片机接收到了1个字节的数据如果说此时没有立刻关闭中断(ES=0;)则会出現 人中狼 前辈最后说的,单片机第二次发送字节数据的时候可能直接进入接收字节中断这种混淆破坏了Flag2位的时效性,直接导致单片机无法正确发送数据

但并不是缺少中断关闭就一定会造成混淆,如果主程序中仅有:

    在这种情况下不要求加入lcd显示的指令,主程序的程序周期大大缩短因此可以在下一个字节接收完毕之前完成当前字节的发送,并正常将Flag位置0;

    但如果加上LCD显示指令完成一次字节的发送的时間周期就会大大增加,从而出现该问答中的问题!


您回复中的“处理”我是否可以认为成这里我想将接受到的几个字符显示在LCD上
    我对您提到的第二种实现方式很感兴趣。您的意思是否可以通过下面的做法实现:可以再接受串口终端(RI==1)中加一个判断语句if(SBUF接收到的数据為'\n'),则关闭串口中断(ES==0;)然后在主程序中对之前在串口中接收到的缓冲区 ...

是的,“处理”就是你需要对接收到的数据做的动作在这裏就是显示。你说的做法是可以的但是关中断去处理的话,有可能导致数据丢包推荐做法是将缓冲区处理(Receivedata[]的赋值)放到中断里,在滿足条件if(SBUF接收到的数据为'\n')后置一个标志位,主程序在检测到该标志位之后进行显示在该过程中是允许数据继续接收的。因为如果需要的数据处理比较繁琐或者主程序中其他内容比较多,来不及处理按照你的关中断的方法,就会丢失数据包不关中断,同时将缓沖区开辟的略大则只是导致两条信息同时处理,而不会丢包

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能

将pptp客户端(C)ip分配到 A、B所在网段启鼡arp代理之类的功能就行了。

这样A、B、C就在同一个局域网内了

提醒 机器C上最好在拨号设置里面把使用远程默认路由去掉

如果非要把C放到其他ip段那么 假设

2) B的默认路由是A 3)在A上配置静态路由 4) 在C上配置静态路由

额,写起来太罗嗦了还是第一种方案吧 :P

我要回帖

更多关于 关于通信方面问题 的文章

 

随机推荐