2016-07-25 68 views
0

我在使用python脚本(在我的笔记本电脑上)和在AVR微控制器上运行的C程序之间进行通信时遇到了一些问题。他们通过UART进行通信。我的问题是现在我有以下设置。如何将Python编号转换为1字节C类型?

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。有没有人有任何建议,我的逻辑是不正确的?

同样,我的猜测是转换和使用签名和无符号数据类型。

谢谢。

+2

您是否使用串行终端程序测试过通信是否正常工作,即您的串行读/写例程在微控制器代码中是否正确? –

+0

不,我没有。考虑到微控制器只是回应它所接收到的内容,这将如何提供帮助? – rangeme

回答

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范围。

+0

我检查过很多次的波特率。这是一个8位微控制器,所以我相信我一次只能发送/接收1个字节。你认为这可能是UART模块的问题吗? – rangeme

+0

用示波器检查一下。如果配置为5位模式,AVR USART将0位置于最高位,这与您的数据不匹配。你的意思是低5位是预期值吗?字节传输有多紧密? –

+0

它被设置为8位模式。我3个最重要的位是什么螺旋。 5个最低有效位是预期值。我告诉它什么时候发送,所以我测试了毫秒和多秒。 – rangeme

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编码,那么值太低不成问题。由于您使用的值范围为0..127,因此您将其编码为无符号的部分也无关紧要。无论如何,软件问题大多会清除高位,格式问题一般只会改变一位奇偶校验。

我真的很想示波器跟踪以及什么对串行线路实际上连接的示意图。有些连接(如通过电容或变压器)需要足够频繁交替的模式,尽管所示模式令人惊讶。观察真实的导线图案至少可以告诉我们失真的发生位置,并且幸运地指出它是什么样的变化。

0

只是为了从“犯罪嫌疑人”排除单片机端软件,并专注于通信线路 - 单片机端连接的Rx/Tx和尝试发送和接收你刚才发送的内容。根据您发送的内容准备好您所收到的内容。发送和接收的缓冲区都应该匹配。然后我们肯定知道 - 敏感器和接收器之间的通信线路设置有问题。