熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2023-7-20 13:24
正文摘要:我學(xué)習(xí)單片機(jī)一段時(shí)間, 現(xiàn)在學(xué)習(xí)RS485通信.用普中A7 我在12C5A60S2開發(fā)板學(xué)習(xí)了一個(gè)用RS485通信的代碼, 是可正常運(yùn)行的, 我用SSCOM32和4IN1的USB->485相互通信也正常. 我把代碼修改一下移植到普中A7開發(fā)板和KST ... |
kscheang 發(fā)表于 2023-7-20 22:48 有可能是兩者的速度不同(1T/12T)形成的差異。在中斷和while(!TI); 之間誰先被執(zhí)行。但你的原代碼確實(shí)是違反邏輯的。就算表面正常工作但還是存有隱患的,如果發(fā)生隨機(jī)莫名其妙的死機(jī)都很難查清原因。上述紅色注釋已經(jīng)解釋得很清楚了。 |
/******************************************************************** 發(fā)送一個(gè)字節(jié) *********************************************************************/ void Send(uchar x) { RS485_DIR=1; //RS485先設(shè)置為發(fā)送 SBUF = x; //將x放入緩沖區(qū) 當(dāng)程序運(yùn)行到這里將觸發(fā)串口中斷,中斷中TI被清0。等跳出串口中斷再執(zhí)行下面的while(!TI);, 就會(huì)永遠(yuǎn)死在這里。兩個(gè)TI清0只能選一個(gè)使用! while(!TI); //如果還未發(fā)送完,不停發(fā)送 等待中斷請求標(biāo)志TI為1 TI=0; //發(fā)送完,中斷請求,TI軟件置0 RS485_DIR=0; //RS485設(shè)置為接收 } /******************************************************************** 發(fā)送接收中斷函數(shù) *********************************************************************/ void uart_isr() interrupt 4 { if( RI ) //如果接收到新字串 { RI = 0; //接收完. 中斷請求, RI軟件置0 dat = SBUF; //將接收緩沖區(qū)的值賦值給dat } if( TI ) TI = 0; //如果發(fā)送新字串, 發(fā)送完,中斷請求,TI軟件置0 } |
Powered by 單片機(jī)教程網(wǎng)