我在python脚本(在我的笔记本电脑上)和在AVR微控制器上运行的C程序之间的通信存在一些问题。他们正在通过UART进行通信。我的问题是现在我有以下设置。
Python发送数据:
data = port.write(struct.pack("b", val))
Python阅读数据:
v = struct.unpack('B', d)[0]
print "%s: %d" % ( time.ctime(time.time()), v )
C(AVR)读数据:
received = (uint8_t) UDR0;
C(AVR)写入数据(回声):
UDR0 = received;
我的问题是这个设置我的python脚本回来的数字如下:
发送:0 - 31,接收:224 - 255 发送:32 - 63收到:32 - 63 发送:62 -95接收:224 - 255 发送:96 - 100接收:224 - 228
我不明白为什么这些数字与它们的匹配程度如何,但我怀疑它是因为我的数据类型。我想过使用chr()和ord()转换为字符和从字符转换,但必须有一种更简单(更易理解)的方式。我开始在python中查看ctypes并且正在寻找使用c_ubyte函数但是无法弄清楚如何正确使用它。我对python很新。有没有人对我的逻辑不正确的地方有任何建议?
同样,我的猜测是转换并使用有符号和无符号数据类型。
感谢。
答案 0 :(得分:0)
我发现了这个问题。代码是正确的。我的AVR板或UART模块有问题。当我发送值0 - 31时,电路板正在接收0b11100000 - 0b11111111。对于32-63,董事会正在收到0b00100000 - 0b00111111。对于64-95,董事会正在收到0b11100000 - ob11111111。对于96 - 100,该板正在接收0b11100000 - 0b11100100。
我不知道为什么我还能获得这些价值。我发现很奇怪3个最重要的部分正在翻转它们的方式。为了解决我的问题,直到我弄清楚是什么问题(看看它是否是我的UART模块)我使用25个值的子集并将我的值递增4以获得我想要的0-100范围。
答案 1 :(得分:0)
让我们快速浏览一下变速器的导线形式。总是起始位0,然后是8位数据位,首先是LSB,然后是停止位1.从描述中,我们得到3位奇数数据,5位正确,所以有8种模式比较。我会在这里从右到左书写电线格式。
>>> for i,highbits in enumerate('111 001 111 111 111'.split()):
... print '1{:03b}ddddd0\t1{}ddddd0'.format(i,highbits)
...
1000ddddd0 1111ddddd0
1001ddddd0 1001ddddd0
1010ddddd0 1111ddddd0
1011ddddd0 1111ddddd0
1100ddddd0 1111ddddd0
我们没有整套测试数据。我们看到的是一大堆组合,其中位设置不应该是,一组看起来正确的异常(0x20-0x3f)。模拟时序问题可以解释一些行为(至少第5位是一致设置),但似乎奇怪的是第二种模式变低但第四种模式不变。
我缺乏具体想法的想法。它的值太低,无法将文件描述符设置为UTF-8编码。您编码为signed并解码为unsigned的部分也不重要,因为您使用0..127范围内的值。软件问题无论如何都会清除高位,格式问题通常只会改变一位奇偶校验。
我非常喜欢示波器跟踪以及串行线上实际连接的示意图。一些连接(例如通过电容器或变压器)需要足够频繁交替的模式,尽管所显示的模式令人惊讶。观察真正的导线模式至少会告诉我们失真发生在哪里,幸运的是它会发生什么样的变化。
答案 2 :(得分:0)
只是从“嫌疑人”中排除微控制器端软件并专注于通信线路 - 在MCU端连接Rx / Tx并尝试发送和接收刚刚发送的内容。 Campare你收到的与你发送的内容有关。发送和接收的缓冲区都应该匹配。然后我们肯定知道 - 感应器和接收器之间的通信线路设置有问题。