![]() |
發布時間: 2019-11-21 01:00
正文摘要:現在采用的是stc12c5a60s2的單片機作為主機,其余六塊作為從機! 主機以廣播的方式發送數組數據,其中包括幀頭+地址+命令+幀尾共四個字節,而且是不斷發送! 在串口助手上可以看到對應的輸出。 問題來 ... |
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.zg4o1577.cn/bbs/dpj-170710-1.html |
1、首先,你試試一對一通信能不能正確接收 2、如果只接收理論上是可以的 3、如果從機還需要發送,如果直接把TX RX并在了主機上,這樣應該不行,你從機的TX不能接在一起 |
主機發送成功了?在串口助手上能夠監控到數據了?以上都成功了,那么從機有成功收到數據么?如果有,那么就是你的程序處理報文的問題了。 |
看上去理論是沒有問題的,不過實際操作會不會哪步出現問題,排查一下啊,從機仿真看一下接收到沒有 |
從機接收端要識別接收,比如一幀數據為:55 01 02 aa , 55 和AA是頭尾,串口接收時叢55開始才放到數組第一個位置,依次接收到最后AA就是一幀數據。開始不是55 的直接退出不接收這樣就避免收到錯誤的數據。 |