首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传输16位数字,而不是8位

传输16位数字,而不是8位
EN

Stack Overflow用户
提问于 2015-02-18 21:32:20
回答 3查看 278关注 0票数 0

但我尝试通过C和TI MSP430将一个16位的数字传输到python脚本。

我传输8位数字没有问题,最高可达255,但一旦数字超过255,它就变成了负256的任何数字。例如,如果我尝试传输数字300,我得到的是44。

我真的不确定我应该修改代码的哪一部分,因为它不是我的代码,而且我对所有这些都是新的。我正在尝试修改现有的代码。这里是我认为的相关部分:这是代码,有人能帮我修改代码来传输高于236的数字吗?可能高达2000个左右。谢谢!

代码语言:javascript
复制
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位数字。目前我有一些类似的东西:

代码语言:javascript
复制
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控制器的传入信息。

EN

回答 3

Stack Overflow用户

发布于 2015-02-18 21:47:19

将您的16位数字传输为两个8位数字:

代码语言:javascript
复制
TXByte = 300 >> 8;
Transmit();
TXByte = 300 & 0xff;
Transmit();

当然,接收端必须知道您使用的是big-endian 16位字,否则会得到错误的结果。

Python的接收器:

代码语言:javascript
复制
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 
票数 2
EN

Stack Overflow用户

发布于 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)

现在,您可以构建一个新函数:

代码语言:javascript
复制
void transmitBigNumber(unsigned short transmitBits) {
    transmit(transmitBits & 0x00FF); transmit(transmitBits >> 8);
}

在接收端,您执行相同的操作,但反过来,您将再次合并字节。

票数 0
EN

Stack Overflow用户

发布于 2015-02-18 23:02:01

让我们假设发送/接收8位数据的能力是最低级别的通信,并从接收端查看这一点。当然,接收所有65,536个16位数据组合需要至少两个8位字节。但是在接收到一个字节时,它是接收到的第一个字节还是第二个字节?因此,需要一些同步。可以使用的标准有很多。我将提出一个想法:UTF-8的变体。

当value对1270时,接收方会看到0-127并知道该值。

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

所有连续字节都以0b10xxxxxx开头,因此如果第一次收到一个字节,代码就会丢弃它,等待01270xb11xxxxxx

在接收到0b110xxxxx时,代码知道这是值0x800x7FF的2字节序列的开始。

在接收到0b1110xxxx时,代码知道这是值0x8000xFFFF的3字节序列的开始。

16位值由前导序列中的可选x位和符合UTF8规范的连续字节组合而成。Example

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28584900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档