话不多说,进入主题。
在stm与openmv进行串口通讯的过程中遇到的问题是,openmv发送信息给stm,而stm只能接收一个字节、也就是只能进入中断一次,stm接受不到结束字符,进入不了一段字符串的结尾判断。而stm、openmv和电脑进行单独通讯的时候都能正常通讯。

#OpenMv的代码:
我使用的初始代码:

while(True):
    uart.write("green")
    time.sleep_ms(1000)

    uart.write("blue")
    time.sleep_ms(1000)

openmv串口发送字符,没有结束符。开始的时候就有想到这个问题,但stm方面的代码也有问题,就没有得到认证,后面慢慢改正才确定是这个问题。

STM32 移植FreeModbusTCP stm32 移植openmv_stm32


STM32 移植FreeModbusTCP stm32 移植openmv_串口通信_02


STM32 移植FreeModbusTCP stm32 移植openmv_串口通信_03


所以openmv程序代码不改的话,就算stm方面能正常接受。openmv发送出去不同的字符串就会被认为是同一条字符串,这样就不能达到我们识别信息的目的了。

STM32 移植FreeModbusTCP stm32 移植openmv_串口通讯_04


STM32 移植FreeModbusTCP stm32 移植openmv_字符串_05

在ascii吗中\r \n这两个字符串的编码分别是0x0d和0x0a。这是我在查看openmv串口通讯例程和电脑通讯时发现的。

while(True):
    uart.write("Hello World!\r")
    time.sleep_ms(1000)

STM32 移植FreeModbusTCP stm32 移植openmv_字符串_06


STM32 移植FreeModbusTCP stm32 移植openmv_串口通信_07


那么,如果我在green后面加上\r \n这两个字符。不就是相当于stm串口通讯要求的以0x0d 0x0a结尾了吗?

下面展示一些 内联代码片

while(True):
    uart.write("green\r\n")
    time.sleep_ms(1000)

    uart.write("blue\r\n")
    time.sleep_ms(1000)

STM32 移植FreeModbusTCP stm32 移植openmv_串口通讯_08


STM32 移植FreeModbusTCP stm32 移植openmv_串口通信_09


可以看出,openmv发送出去的字符串能被分割开了,stm方面也能正常接受到。

因为篇幅的原因,stm方面的代码在下一章写。

小白一枚,第一次写博客,多多指教!有什么问题及错误的地方,欢迎提出。