但我尝试通过C和TI MSP430将一个16位的数字传输到python脚本。
我传输8位数字没有问题,最高可达255,但一旦数字超过255,它就变成了负256的任何数字。例如,如果我尝试传输数字300,我得到的是44。
我真的不确定我应该修改代码的哪一部分,因为它不是我的代码,而且我对所有这些都是新的。我正在尝试修改现有的代码。这里是我认为的相关部分:这是代码,有人能帮我修改代码来传输高于236的数字吗?可能高达2000个左右。谢谢!
unsigned char BitCnt;
unsigned int TXByte;
void Transmit(void);
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
TXByte = 300;
Transmit();
}
}
void Transmit()
{
BitCnt = 0xA; // Load Bit counter, 8 data + Start/Stop bit
TXByte |= 0x100; // Add mark stop bit to TXByte
TXByte = TXByte << 1; // Add space start bit
TACCR0 = TAR+ Bitime;
TACCTL0 = CCIS0 + OUTMOD0 + CCIE; // TXD = mark = idle, enable interrupts
// OUTMOD0 sets output mode 1: SET which will
// have the CCR bit (our TX bit) to go high when the timer expires
while ( TACCTL0 & CCIE ); // Wait for TX completion
}Python脚本:所以现在我需要编辑我的python脚本来组合这两组8位数字。目前我有一些类似的东西:
while(1): #loop forever
data = ser.read(1) # look for a character from serial port
if len(data) > 0: #was there a byte to read? Will always be true
yvals[49] = ord(data)我如何组合8位的数字集?“‘data”是来自MSP430控制器的传入信息。
发布于 2015-02-18 21:47:19
将您的16位数字传输为两个8位数字:
TXByte = 300 >> 8;
Transmit();
TXByte = 300 & 0xff;
Transmit();当然,接收端必须知道您使用的是big-endian 16位字,否则会得到错误的结果。
Python的接收器:
while(1): #loop forever
new_value = 0
for byte_count in range(2): # we need to wait two bytes
data = ser.read(1) # read one byte at a time
if len(data) > 0:
# the first byte is right-shifted by b bits, the second not.
new_value += ord(data[0]) << 8*(1-byte_count)
# new_values contains a 16-bit integer
yvals[49] = new_value 发布于 2015-02-18 21:58:25
您的问题在以下注释//加载位计数器中,8数据+开始/停止位。
如果有8个数据位,则可以表示的最大数字是2^8-1 = 255。例如,将字节设置为300时会发生以下情况: 300: 0b'100101100 empty byte: 0b'00000000如果将字节设置为300,则只复制8个最低有效位(因为其他位没有空格),因此最终得到的数字为0b'00101100,即44
编辑:我想你应该改变传输函数,使它不传输一个存储在全局函数中的字节,而是一个输入到函数中的字节,所以你得到: void transmit(unsigned char transmitByte)
现在,您可以构建一个新函数:
void transmitBigNumber(unsigned short transmitBits) {
transmit(transmitBits & 0x00FF); transmit(transmitBits >> 8);
}在接收端,您执行相同的操作,但反过来,您将再次合并字节。
发布于 2015-02-18 23:02:01
让我们假设发送/接收8位数据的能力是最低级别的通信,并从接收端查看这一点。当然,接收所有65,536个16位数据组合需要至少两个8位字节。但是在接收到一个字节时,它是接收到的第一个字节还是第二个字节?因此,需要一些同步。可以使用的标准有很多。我将提出一个想法:UTF-8的变体。
当value对127为0时,接收方会看到0-127并知道该值。
当值为128-255时,接收器知道它是多字节传输的一部分。
所有连续字节都以0b10xxxxxx开头,因此如果第一次收到一个字节,代码就会丢弃它,等待0到127或0xb11xxxxxx。
在接收到0b110xxxxx时,代码知道这是值0x80到0x7FF的2字节序列的开始。
在接收到0b1110xxxx时,代码知道这是值0x800到0xFFFF的3字节序列的开始。
16位值由前导序列中的可选x位和符合UTF8规范的连续字节组合而成。Example
https://stackoverflow.com/questions/28584900
复制相似问题