python读取串⼝16进制数_python3串⼝通信——16进制数python3串⼝通信——16进制数
在调试STM32与PC进⾏串⼝通信时,⼆者之间需要发送各种类型的数据,如uint_8、int16_t、float等等,需要将所有类型的数据转换成uint_8类型发送,同时上位机要能转换回来。
⼀.下位机
uint_8 型
发送:直接利⽤USART_SendData函数,通常配合检测发送结束位使⽤,如下:
void usart1_send_data(uint8_t num){
USART_SendData(USART1, num);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}
接收:很简单,直接赋值即可。
int16_t型
发送:int16_t型涉及到补码,但是可以留到上位机解决,只要分别发送⾼低8位数就可以。
void send_int16_t(int16_t num){
uint8_t high_8, low_8;
low_8 = num & 0x00FF;
high_8 = (num>>8) & 0x00FF;
usart1_send_data(high_8);
usart1_send_data(low_8);
}
接收:定义⼀个int16_t类型的数,将接收到⾼低⼋位分别移位即可,贴的代码中的LOW和HIGH变量只是⼀个例⼦,参考这个代码改就⾏。
int16_t temp = 0;
temp |= (int16_t)LOW[4]&0x00FF;
temp |= ((int16_t)HIGH<<8)&0xFF00;
float型
发送:虽然float型⽐较复杂,但是由于我⽤到的数都⽐较⼩,⽽且精度不⾼,所以可以把float分整数、⼩数发送出去。如果需要发送⼤数,可以把下⾯代码中的interger和decimal改成16位类型。
void send_float(float num){
uint8_t integer, decimal; // 限制在uint8_t型
integer = (uint8_t)num;
decimal = (uint8_t)(( num-(uint8_t)num )*100); // 取两位⼩数
usart1_send_data(integer);
usart1_send_data(decimal);
}
接收:定义⼀个float型数,将⼩数部分*100加上整数部分即可,如下:
float num_f;
num_f = interger + decimal/100.0f;
⼆.上位机(Python)
uint8_t型
发送:⽐如要发送16进制的23(10进制35),直接通过pyserial的write函数,发送b"\x23"或者bytes([35])。
ser.write(b"\x23") // ser.write(bytes([35]))
接收:调⽤pyserial的read读取的bytes型,直接取数即可,例如:
response = ad(1)
num = response[0]
int16_t型
发送:由于要考虑补码问题,但是可以通过ctypes的c_short(16位有符号整型)解决,不需要⾃⼰从补码解到原码,如下: _num = c_short(num)
high_8 = (_num.value & 0xff00)>>8
low_8 = _num.value & 0x00ff
ser.write(bytes([high_8, low_8]))
接收:
num = c_short(0)
num.value |= high_8 << 8
num.value |= low_8
float型
发送:和下位机⼀样,分开发送整数和⼩数即可,如下:
my_byte = bytes([int(num_f), int(100 * (num_f - int(num_f)))])
ser_write(my_byte)
接收:同下位机,如下:
python怎么读取串口数据num_f = round(interger + decimal[2]/100, 1)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论