void UART1_RX (void) interrupt 4 using 2 { if(RI) { RI = 0; if(SBUF==0x55) RX1_Cnt = 0; RX1_Buffer0[RX1_Cnt] = SBUF; if(++RX1_Cnt >= 5) { RX1_Cnt = 0; } } if(TI) { TI = 0; busy=0; } } void dataCompare( ) { if(((RX1_Buffer0[0] ==0x55)&&(RX1_Buffer0[4] ==0xaa))&&( (RX1_Buffer0[1]==地址))) { 数据处理; } } |
现在卡在从机的接受数据上,在编写好接受程序之后,我试着用串口助手去发送0XAA 看是否有反应,结果一动不动。 ![]() |
//主机 uchar add=0; uchar dis[]={0xAA,addr1,0x01,0xFF}; /*****主程序*****/ void main() { int i; Uart_Init(); while(1) { for(i=0;i<4;i++) { SBUF=dis[i]; while(!TI); //等特数据传送 TI=0; //清除数据传送标志 } delayms(500); } } |
//从机 void main() { int tem; uchar Data[4],t; Uart_Init(); while(1) { //在串口助手检测程序有没运行 tem++; if(tem%10000==0) { SBUF = 0X00; while(!TI);//当写下这句的时候,就不要在中断函数里面在写TI = 0;这句了,不然进入中断函数将TI清零之后,程序就会一直卡在这里 TI = 0; //在这里将TI清零 SM2=0; } //接收数据 for(t=0;t<4;t++) { Data[t]=SBUF; while(!RI); RI=0; if(SBUF==0XFF) { SM2=1; t=0; } } if(Data[0]==0xAA) { SBUF = 0X11; while(!TI);//当写下这句的时候,就不要在中断函数里面在写TI = 0;这句了,不然进入中断函数将TI清零之后,程序就会一直卡在这里 TI = 0; //在这里将TI清零 } } |
pcbboy 发表于 2019-11-21 08:07
|
1、多机通讯采用 RS485 方式 2、先把一对一的调试好 3、在扩展到6个分机 4、给你看一个 20 点485通讯的 http://www.51hei.com/bbs/dpj-170710-1.html |
1、首先,你试试一对一通信能不能正确接收 2、如果只接收理论上是可以的 3、如果从机还需要发送,如果直接把TX RX并在了主机上,这样应该不行,你从机的TX不能接在一起 |
主机发送成功了?在串口助手上能够监控到数据了?以上都成功了,那么从机有成功收到数据么?如果有,那么就是你的程序处理报文的问题了。 |
看上去理论是没有问题的,不过实际操作会不会哪步出现问题,排查一下啊,从机仿真看一下接收到没有 |
从机接收端要识别接收,比如一帧数据为:55 01 02 aa , 55 和AA是头尾,串口接收时丛55开始才放到数组第一个位置,依次接收到最后AA就是一帧数据。开始不是55 的直接退出不接收这样就避免收到错误的数据。 |