熱門(mén): 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2021-11-12 11:05
正文摘要:程序小白請(qǐng)教大佬,串口發(fā)送指令只執(zhí)行一次功能,后面發(fā)送的指令串口助手能正常發(fā)送接收,但功能沒(méi)出來(lái),程序怎么修改? 主要是我想發(fā)送不同長(zhǎng)度的指令,指令長(zhǎng)度一樣的話程序是沒(méi)問(wèn)題的 |
Y_G_G 發(fā)表于 2021-11-12 16:53 學(xué)習(xí)了謝謝 |
//串口接收上位機(jī),可以用strstr函數(shù)查找,比如,上位機(jī)發(fā)送 數(shù)據(jù):255 //單片機(jī)可以先查找"數(shù)據(jù):",查找到之后再處理后面的255,這樣的代碼可以簡(jiǎn)單明了很多 void Uart2_Isr() interrupt 8 //串口2中斷 { char *p,Uart_S[15]; static unsigned char RX_Count; unsigned a; if(S2CON&0x02) { S2CON&=~0x02; //清除中斷發(fā)送標(biāo)示位 Busy=0; // return; } //──────────────────────────────────────────────────────────────────────────── if(S2CON&0x01) { S2CON&=~0x01; //清除中斷接收標(biāo)示位 Uart_S[RX_Count]=S2BUF; RX_Count++; p=strstr(Uart_S,"數(shù)據(jù):"); //查找指令結(jié)束符"數(shù)據(jù):" if(NULL!=p) //如果沒(méi)有查找到"數(shù)據(jù):",指針?lè)祷刂禐榭?br /> { //指針?lè)祷刂挡粸榭?就表示串口接收到"數(shù)據(jù):",處理......... } } //────────────────────────────────────────────────────────────────────────────── } |
188610329 發(fā)表于 2021-11-12 15:43 好的謝謝 |
用for 循環(huán) 假定你的 dat 長(zhǎng)度為64 for(j=0, j<63,j++) //循環(huán)63次 { dat[j] = dat[j+1]; } 然后再去對(duì)比指令。 |
188610329 發(fā)表于 2021-11-12 14:30 利用 dat[j] = dat[j+1]; 具體怎么實(shí)現(xiàn)的呢? |
首先需要確認(rèn),你的 i 是全局變量, 然后, 你即使 sflag == FALSE 也要 i=0 不然,只要有一個(gè)錯(cuò)誤指令,后面你的指令位置都不會(huì)從0開(kāi)始,永遠(yuǎn)指令都是錯(cuò)誤的。 通常有兩個(gè)方案, 1)按照波特率的 105倍計(jì)時(shí),超過(guò)后,判斷超時(shí)(表示所有指令都已經(jīng)接受完畢),開(kāi)始驗(yàn)證指令,驗(yàn)證完畢后,不管指令對(duì)不對(duì),都把 i=0 準(zhǔn)備接受下一個(gè)指令。 2)利用 dat[j] = dat[j+1]; 進(jìn)行移位,多次反復(fù)比較指令,那么就不在乎 i 有沒(méi)有歸零了。 |
Powered by 單片機(jī)教程網(wǎng)