各位高手请指点下,您的指导是他人前进的不竭动力。为什么我用51单片机发送5个字节的命令,传感器没有返回5个值,而我不用51单片机,直接用串口调试助手给CO2浓度传感器发送相同的5个字节的命令,CO2浓度传感器有5个字节的值返回过来呢?而且我用串口给这个51单片机发送5个命令也可以接收,并显示这5个字节数据处理后的数值。 如果能帮我解决这个问题,我将表示最诚挚的感谢。
//通信协议如下:波特率19200,8位数据位,一位停止位
#define N 5 //接收字节数
void uart_init();
void delay_ms(uint z);
uchar flag,i; //删除无用变量
uchar code table[]={0xff,0xfe,0x02,0x02,0x03}; //发送5个人字节的命令
uchar table1[N]; //接收缓存数组
uchar j=0;
uint Co2_Val,CO2_RANGE=5000;
unsigned char num[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
'B', 'C', 'D', 'E', 'F' };
void LCD_INIT();
void Data_Decode(uchar* ptr);
void write_data(uchar data1); //lcd1602显示
void write_com(uchar command);
void write_char(uchar line, uchar num, char a);
main()
{
uchar *p;
uint Co2_hi,n;
uart_init();
LCD_INIT(); //
while(1)
{
ES=0;
for(i=0;i<5;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
}
ES=1;
delay_ms(500);
if(flag==1)
{
ES=0;
p=table1;
Data_Decode(p); //接收到的数据处理函数
Co2_hi=Co2_Val/1000;
if(Co2_hi!=0)
{write_char(0,1,num[Co2_hi]);}
write_char(0,2,num[Co2_Val/100%10]);
write_char(0,3,num[Co2_Val/10%10]);
write_char(0,4,num[Co2_Val%10]);
ES=1;
flag=0;
}
delay_ms(50);
}
}
void uart_init() //晶振11.0592,波特率19200
{
TMOD = 0x20;
SCON = 0x50; // SM0=0; SM1=1;
REN=1;
TH1 = 0xFD;
TL1 = 0xFD;
PCON=0x80; //波特率加倍
EA = 1;
ES = 1;
TR1 = 1;
}
void ser()interrupt 4
{
RI=0;
table1[j++]=SBUF; //存数据到接收缓存
if(j==N) //数组满时,允许处理
{ flag=1;
j=0;
}
}
/****************************************
名称:Data_Decode
功能: 数据解码
输入:
输出:
****************************************/
void Data_Decode(uchar* ptr)
{
unsigned long temp = 0;
//FF FA 02 02 50
temp = ptr[3];
temp <<= 8;
temp |= ptr[4];
if(temp >= CO2_RANGE) //限制最大值
{
temp = CO2_RANGE - 1;
}
Co2_Val = temp;
// 传感器通信指示:
//----------------------------------------------------------------
// Time_REF.CO2_counter = 0; //传感器正常采样时间累计清零
// LP_Flash;
}





8楼
数据通道二选一,剩下一个接上去,就两种接法,我都试过。一种无法返回,就是错的,另一中就是返回很多00 00 00和几个错误的数据。中断,逻辑,初始化我检测了也没看出问题,你看有问题吗?返回应该是FF FA 02+两个字节的数据。

9楼
是不是单片机出来的信号要经过MAX232转换啊?我直接用单片机的RXD,TXD管脚和传感器的RXD,TXD管脚相连的

回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
Buck电路工作在CCM模式下电感电流的计算公式是什么?被打赏5分 | |
buck电路工作原理被打赏5分 | |
基于MSPM0L1306的MODBUS-RTU协议通讯实验被打赏50分 | |
每周了解几个硬件知识+485硬件知识分享被打赏10分 | |
【换取手持示波器】树莓派PICOW网页烟花被打赏18分 | |
【换取手持示波器】树莓派PICO逻辑分析仪被打赏16分 | |
【分享评测,赢取加热台】教你五分钟本地部署蒸馏版本的DeepSeekR1-7B被打赏12分 | |
【换取手持示波器】蓝牙音箱更换电池被打赏8分 | |
【换取手持示波器】鼠标更换微动开关被打赏10分 | |
【我要开发板】4.传感器移植被打赏50分 |