单片机读取实时读取IO数据

我是通过一个单片机通过74HC595传输数据给另一个单片机的P0和P2口,现在我想读取数据,但发现数据明显不对。传输过来的数据有一个帧头0xaa,然后是编号,数据,如:0xaa 0x01 0x01 0xa4。现在有这么两组数据如:0xaa 0x01 0x01 0xa4,0xaa 0x02 0x00 0xb4,但接收到数据是0xaa 0x01 0x01 0xa4,0xaa 0x01 0x00 0xb4 或者 0xaa 0x02 0x01 0xa4,0xaa 0x02 0x00 0xb4。P0口代表帧头和编号数据,P0和P2共同传输16位数据参数。
程序如下:
void read_io(void)
{
if(P0==0xaa)
{
delay(5);
if(P0==0xaa)
buf[0]=0xaa;
}
else if((P0==0x01)||(P0==0x02)||(P0==0x03))
{
delay(5);
if((P0==0x01)||(P0==0x02)||(P0==0x03))
buf[1]=P0;
}
else
{
buf[2]=P2; //数据高八位
buf[3]=P0; //数据低八位
}

}

一直循环检测IO口状态,检测到起始信号边缘(如51单片机IO口一直是高电平,当检测到出现低电平即为启动信号),然后利用延时程序延时0.5ms,读取每个数据位的中间位置,判断是0还是1。
根据你的实际要求,第一次读取肯定是高电平,第二次读取为低电平,你需要再判断第三次和第四次,如果第三、四次均为低电平则为数据1,如果不是则为数据0。

个人感觉你这个通信协议有点问题,需要改进。原因如下:
比如顺氦矗份匪莓睹逢色抚姬序出现高、低、低电平时已经可以判断为1了,第四个电平是没有作用的。还有你这个协议由于数据1传输结尾时低电平,因此需要以高电平作为启动信号,而大部分单片机都是以低电平为启动信号的。
温馨提示:答案为网友推荐,仅供参考
相似回答