尝试远景,但我试图通过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位数字? &#39;数据&#39;是来自MSP430控制器的传入信息。
答案 0 :(得分:2)
将您的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
答案 1 :(得分:0)
您的问题出现在以下评论中 //加载位计数器,8个数据+开始/停止位。
如果有8个数据位,则可以表示的最大数字是2 ^ 8-1 = 255 例如,当您将字节设置为300时,会发生以下情况: 300:0b'100101100 空字节:0b'00000000 如果你将字节设置为300,只复制了8个最低有效位(其他的没有空格),所以你得到的数字是0b'00101100,这是44
编辑: imho你应该改变传输函数,使它不传输一个存储在全局但是输入到函数的字节的字节,所以你得到:void transmit(unsigned char transmitByte)
现在您可以构建一个新功能:
void transmitBigNumber(unsigned short transmitBits) {
transmit(transmitBits & 0x00FF); transmit(transmitBits >> 8);
}
在接收方,你做同样的事情,但反过来又合并了字节。
答案 2 :(得分:0)
让我们说发送/接收8位数据的能力是最低级别的通信,并从接收端查看。当然,接收所有65,536个16位数据组合需要至少两个8位字节。但收到一个字节后,它是收到的第一个还是第二个字节?因此需要一些同步。有许多标准可以使用。我会提出一个想法:UTF-8上的变体。
当值为0
到127
时,接收方会看到0-127
并知道该值。
当值为128-255
时,接收方知道它是多字节传输的一部分。
所有连续字节都以0b10xxxxxx
开头,因此如果首次收到,则代码会丢弃该代码,等待0
到127
或0xb11xxxxxx
。
收到0b110xxxxx
后,代码知道这是值0x80
到0x7FF
的2字节序列的开头。
收到0b1110xxxx
后,代码知道这是值0x800
到0xFFFF
的3字节序列的开头。
通过组合前导序列中的可选x
位和每个UTF-8规范的连续字节来形成16位值。 Example