传输16位数而不是8位

时间:2015-02-18 13:32:20

标签: c microcontroller

尝试远景,但我试图通过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控制器的传入信息。

3 个答案:

答案 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上的变体。

当值为0127时,接收方会看到0-127并知道该值。

当值为128-255时,接收方知道它是多字节传输的一部分。

所有连续字节都以0b10xxxxxx开头,因此如果首次收到,则代码会丢弃该代码,等待01270xb11xxxxxx

收到0b110xxxxx后,代码知道这是值0x800x7FF的2字节序列的开头。

收到0b1110xxxx后,代码知道这是值0x8000xFFFF的3字节序列的开头。

通过组合前导序列中的可选x位和每个UTF-8规范的连续字节来形成16位值。 Example