打印
[技术问答]

UART碰到的一些问题

[复制链接]
2164|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pq113_6|  楼主 | 2019-10-28 16:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
JasonLee27| | 2019-10-29 10:07 | 只看该作者
我使用过UART1,在115200波特率的情况下,是正常通信没有问题的,

使用特权

评论回复
板凳
pq113_6|  楼主 | 2019-10-29 12:39 | 只看该作者
JasonLee27 发表于 2019-10-29 10:07
我使用过UART1,在115200波特率的情况下,是正常通信没有问题的,

嗯,确实不是UART的问题,我这边是在systick里面定时取走uart数据,可能是没有及时取走数据,奇怪的是别的MCU都没有这个问题,10ms都可以正常工作,AC的必须要1ms才可以,我现在是在loop里面一直读uart的话,256000也是OK的

使用特权

评论回复
地板
JasonLee27| | 2019-10-29 15:00 | 只看该作者
pq113_6 发表于 2019-10-29 12:39
嗯,确实不是UART的问题,我这边是在systick里面定时取走uart数据,可能是没有及时取走数据,奇怪的是别 ...

定时取?不知道别的MCU怎么实现得,AC的收发缓存fifo只有2byte,所以两个字节没有取,下一个字节就丢失了

使用特权

评论回复
5
pq113_6|  楼主 | 2019-10-30 09:45 | 只看该作者
JasonLee27 发表于 2019-10-29 15:00
定时取?不知道别的MCU怎么实现得,AC的收发缓存fifo只有2byte,所以两个字节没有取,下一个字节就丢失 ...

开一个buffer,UART中断把数据存在buffer中,定时1ms判断这个buffer是否有数据。最大是267个字节数据,我已经开了一个8KB的buffer,但是还是有问题,现在我用256000也是可以正常工作的,所以UART应该没问题,只是我不太理解为什么,在查为什么,感觉是2个中断可能有冲突

使用特权

评论回复
6
AutochipsMCU| | 2019-10-30 15:21 | 只看该作者
pq113_6 发表于 2019-10-30 09:45
开一个buffer,UART中断把数据存在buffer中,定时1ms判断这个buffer是否有数据。最大是267个字节数据,我 ...

问题原因有查明吗?
另外这个问题还是存在?你是在什么环境下测的呢
1. UART2(PD1和PD2对应的UART)烧录完重启无打印,必须断电重启才有打印,而且断电后会不停的发乱码,奇怪的是如果用UART1作为printf就不会有这个问题。

使用特权

评论回复
7
AutochipsMCU| | 2019-10-30 15:23 | 只看该作者
AutochipsMCU 发表于 2019-10-30 15:21
问题原因有查明吗?
另外这个问题还是存在?你是在什么环境下测的呢
1. UART2(PD1和PD2对应的UART)烧录 ...

我们工程里面默认就是配的UART2打log,也就是PD1,PD2。

使用特权

评论回复
8
pq113_6|  楼主 | 2019-10-30 15:34 | 只看该作者
AutochipsMCU 发表于 2019-10-30 15:21
问题原因有查明吗?
另外这个问题还是存在?你是在什么环境下测的呢
1. UART2(PD1和PD2对应的UART)烧录 ...

没有查明,感觉是串口问题,我昨天是57600还可以正常,今天就有失败率了,还有256000也是,偶尔也能正常,另外我的数据是会做校验的,会看到校验错误,我在研究降系统频率试试。第1个问题应该是我的问题,估计是我用的DAPLINK不支持软复位

使用特权

评论回复
9
AutochipsMCU| | 2019-10-30 15:41 | 只看该作者
pq113_6 发表于 2019-10-30 15:34
没有查明,感觉是串口问题,我昨天是57600还可以正常,今天就有失败率了,还有256000也是,偶尔也能正常 ...

是指USB转UART的工具吗?MCU发送接收部分应该没有问题吧

使用特权

评论回复
10
pq113_6|  楼主 | 2019-10-30 16:17 | 只看该作者
AutochipsMCU 发表于 2019-10-30 15:41
是指USB转UART的工具吗?MCU发送接收部分应该没有问题吧

应该没问题,这套软件在很多MCU上跑过,用过4年以上了,都没有碰到问题,我是用PC通过USB转UART(FTDI的芯片,稳定性应该够)发送数据烧录Nor Flash,bin文件都是几MB的数据,软件构架可以换成STM32F030,都没有问题。每笔数据都会做CRC校验,CRC成功或者失败都会回ECO给PC,目前看到有几率会失败,而且是数据量大一些的时候才出现,因为大部分失败都是在写大数据的阶段,可以看到有时候会失败,成功,失败这样的过程。

使用特权

评论回复
11
pq113_6|  楼主 | 2019-10-30 16:18 | 只看该作者
AutochipsMCU 发表于 2019-10-30 15:41
是指USB转UART的工具吗?MCU发送接收部分应该没有问题吧

另外,我改成72M的主频,结果SPI通信出错了,我的配置是:
#if USE_XTAL == XTAL_8M
#define PLL_POSDIV   PLL_POSDIV_4
#define PLL_FBKDIV   72//96
#define PLL_PREDIV   PLL_PREDIV_1

#define SYSCLK_DIV   SYSCLK_DIVIDER_1
#define APBCLK_DIV   APBCLK_DIVIDER_2
#define SYSCLK_FREQ  72000000//96000000
#define APB_BUS_FREQ 36000000//48000000
这样改对吗?

使用特权

评论回复
12
pq113_6|  楼主 | 2019-10-30 17:32 | 只看该作者
本帖最后由 pq113_6 于 2019-10-30 17:50 编辑
AutochipsMCU 发表于 2019-10-30 15:41
是指USB转UART的工具吗?MCU发送接收部分应该没有问题吧


我试了一下回显,在接收中断里面把接收到的数据在发回来,看到问题了
我发送AA 55 00 01 00 00 7F,结果少了2个00
如果改一下回显,直接发送,接收的数据就对了,似乎是中断处理时间太长了?mark掉的是出问题的代码,uartSendByte是直接发送数据
//Printf("%x ", pUartRecvBuf[port][gUartRecvIn[port] - 1]);
uartSendByte(UART2, pUartRecvBuf[port][gUartRecvIn[port] - 1]);




使用特权

评论回复
13
TechHolder| | 2019-10-30 17:57 | 只看该作者
pq113_6 发表于 2019-10-30 16:18
另外,我改成72M的主频,结果SPI通信出错了,我的配置是:
#if USE_XTAL == XTAL_8M
#define PLL_POSDIV  ...

时钟配置72M正确,系统时钟改变导致执行时间也改变。

使用特权

评论回复
14
TechHolder| | 2019-10-30 17:58 | 只看该作者
pq113_6 发表于 2019-10-30 17:32
我试了一下回显,在接收中断里面把接收到的数据在发回来,看到问题了
我发送AA 55 00 01 00 00 7F,结果 ...

使用特权

评论回复
15
AutochipsMCU| | 2019-10-30 18:05 | 只看该作者
pq113_6 发表于 2019-10-30 17:32
我试了一下回显,在接收中断里面把接收到的数据在发回来,看到问题了
我发送AA 55 00 01 00 00 7F,结果 ...

也就是说用printf发数据就有问题,直接发送就是正常的是吧?
有可能是两个原因:
1.printf有可能对数据格式化处理丢掉了数据。
2.printf执行时间太长,导致中断中处理时间太长。

个人感觉原因2的可能性更大。在编程的时候一般都建议不要在中断里面做超时的动作,比如printf。

使用特权

评论回复
16
AutochipsMCU| | 2019-10-30 18:05 | 只看该作者
pq113_6 发表于 2019-10-30 17:32
我试了一下回显,在接收中断里面把接收到的数据在发回来,看到问题了
我发送AA 55 00 01 00 00 7F,结果 ...

也就是说用printf发数据就有问题,直接发送就是正常的是吧?
有可能是两个原因:
1.printf有可能对数据格式化处理丢掉了数据。
2.printf执行时间太长,导致中断中处理时间太长。

个人感觉原因2的可能性更大。在编程的时候一般都建议不要在中断里面做超时的动作,比如printf。

使用特权

评论回复
17
AutochipsMCU| | 2019-10-30 18:05 | 只看该作者
pq113_6 发表于 2019-10-30 17:32
我试了一下回显,在接收中断里面把接收到的数据在发回来,看到问题了
我发送AA 55 00 01 00 00 7F,结果 ...

也就是说用printf发数据就有问题,直接发送就是正常的是吧?
有可能是两个原因:
1.printf有可能对数据格式化处理丢掉了数据。
2.printf执行时间太长,导致中断中处理时间太长。

个人感觉原因2的可能性更大。在编程的时候一般都建议不要在中断里面做超时的动作,比如printf。

使用特权

评论回复
18
JasonLee27| | 2019-10-31 09:14 | 只看该作者
pq113_6 发表于 2019-10-30 17:32
我试了一下回显,在接收中断里面把接收到的数据在发回来,看到问题了
我发送AA 55 00 01 00 00 7F,结果 ...

printf本来就是通过uart2输出格式化字符串,如果uart2在用于打印输出,不建议再通过其他方式使用,或者在其他地方再初始化uart2

使用特权

评论回复
19
pq113_6|  楼主 | 2019-10-31 09:49 | 只看该作者
JasonLee27 发表于 2019-10-31 09:14
printf本来就是通过uart2输出格式化字符串,如果uart2在用于打印输出,不建议再通过其他方式使用,或者在 ...

用了2个UART,UART2打印,UART1和PC通信,这套机制用过的MCU有stm32f030,stm32f103, stm32f207, PIC24, ATmega328p, C8051, FT9xx等等,一直都没问题,我也在查是不是这套机制还有什么bug,不过很奇怪的,UART一会能工作,一会又不行

使用特权

评论回复
20
pq113_6|  楼主 | 2019-10-31 11:23 | 只看该作者
本帖最后由 pq113_6 于 2019-10-31 11:30 编辑
AutochipsMCU 发表于 2019-10-30 18:05
也就是说用printf发数据就有问题,直接发送就是正常的是吧?
有可能是两个原因:
1.printf有可能对数据格 ...

我用官方例程改了一个uart的程序,复现到问题了,测试方法如下:
1. 例程改为2路UART,UART1作为通信使用,UART2输出UART1接收到的数据。例程代码如附件。
UART_Sample.zip (794.91 KB)
2. 打开2个sscom软件,分别对应UART1和UART2

3. 对应UART1的串口发送数据:
aa 55 00 04 01 04 00 00 00 00 78 9c ec 9d 7f 6c 23 d7 7d e0 4d 5e 89 25 b8 e8 70 59 92 65 78 0d 09 32 a2 04 fe 10 49 95 a0 c8 52 14 24 0c 53 51 50 a6 77 09 c5 52 71 55 61 c5 70 b9 58 46 62 4f eb f8 07 23 fb 84 08 56 28 68 e3 54 52 5c 57 e0 69 77 05 09 4c 16 da 36 36 4e 4a ac 83 7b 67 41 ce 26 3e 6c 37 f1 fa 92 b5 ef 10 e0 72 c0 a5 69 70 b8 3a ce a1 ed fa 8f 02 ed bd ef 7b 6f 86 33 e4 f0 87 d6 6b 89 f2 ea eb ba 70 a4 e1 f0 91 7a 9f f9 fe fe be 9f 7d b0 8f fe f9 af 91 bf 18 fd d9 07 b1 91 77 ee 7f fa d9 f7 9f fb ab 77 bf f7 c5 60 fe 5f fe a5 e3 d9 eb ef bf 73 bf ff 97 5b ef ce bd 5f fe da f5 f7 df 7f ee 3f bc d5 f3 d5 d9 b7 12 5f ef f9 aa f6 ab 8f bf b9 fe ee c1 bb 13 bf fc a7 9f 7d ee ab ef be fe d3 77 3f 78 7d ef d5 3f 99 9e 7b 7f a8 fc 3b ff eb 73 b3 bf f7 e6 e5 d9 9f a2 df ce be f5 ab 52
4. 接收端会看到总是会少收到1个字节数据。如上图中少了一个字节0x05

无标题.png (496.32 KB )

无标题.png

使用特权

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

本版积分规则

36

主题

284

帖子

2

粉丝