|
在下新人,现在试着做一个基于STM32,用CAN总线将ds18b20温度传感器测得的温度数据通过CAN总线传给上位机的设计。先试着把传感器数据显示在OLED屏上,这没什么难度。然后我试着用回环模式模拟CAN总线的通信,遇到了问题。
DS18b20传感器的卖家(正点原子)提供了ds18b20的驱动程序,输出的数据是有符号short类型的;
short DS18B20_Get_Temp(void)
{
u8 temp; //定义无符号char变量temp TL TH
u8 TL,TH;
short tem; //定义short变量tem
.......
if(temp)return tem; //转换,读取温度值
else return -tem;
}
但是CAN总线的收发程序使用指针读取/写入一个u8类型(无符号char)的数据(该数据为缓存区?)
u8 CAN_Tx_Msg(u32 id,u8 ide,u8 rtr,u8 len,u8 *dat)
void CAN_Rx_Msg(u8 fifox,u32 *id,u8 *ide,u8 *rtr,u8 *len,u8 *dat)
u8 CAN_Send_Msg(u8* msg,u8 len)
u8 CAN_Receive_Msg(u8 *buf)
我翻了stm32f10x_can.h也没找到使用其他数据类型的收发函数,也就是说我能力范围内CAN总线只能用u8类型数据通信了。
ds18b20输出的short数据类型没办法直接通过CAN总线传输,我试着把它转换成u8,
u8 sendmid; //定义无符号char变量sendmid ,rcvmid
u8 rcvmid;
short temperature; //定义short变量temperature
temperature=DS18B20_Get_Temp(); //将传感器测得的温度值赋给temperature
OLED_ShowNum(0+16,16,temperature/10,2,16); //显示正数部分
OLED_ShowNum(0+16+32,16,temperature%10,2,16); //显示小数部分
......
sendmid=temperature; //将temperature的值赋给sendmid
OLED_ShowNum(50,32,sendmid,8,16); //显示发送出的数据
CAN_Send_Msg(&sendmid,8);//发送8个字节 //CAN总线发送数据
......
CAN_Receive_Msg(&rcvmid); //CAN总线接收数据
OLED_ShowNum(40,48,rcvmid,8,16); //显示收到的数据
这样倒也ping通了,send和rcv的数据是一致的,这两个数也是跟着测得的温度值变化的——温度升高,这两个数变大;温度下降,这两个数减小。
但是温度的测量值是271的时候(ds18b20以整数方式输出数据,最低位为0.1度),这两个数据却只有14的数值,而且和温度数据在数值上找不到什么稳定的数量关系,仅仅变化趋势一致。。。。。。
我想可能是数据从short数据类型转换成无符号char数据的过程中出现了精度损失?那我该怎么设计程序才能把温度的测量值(-550——+1250的整数)通过CAN总线传输到上位机,或者至少能通过回环模式传输?
麻烦各位大神解答了,谢谢。
|
|