找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1758|回復(fù): 4
收起左側(cè)

單片機(jī)串口數(shù)據(jù)接收程序問(wèn)題

[復(fù)制鏈接]
ID:1060138 發(fā)表于 2023-1-20 17:51 | 顯示全部樓層 |閱讀模式
想要實(shí)現(xiàn)串口從上位機(jī)接收到的數(shù)據(jù)一個(gè)一個(gè)存入數(shù)組中,
但是經(jīng)過(guò)測(cè)試,數(shù)據(jù)只能存到數(shù)組的第一位中,而且RI=0所在位置不同,存入內(nèi)容長(zhǎng)短不同


void UART1_Isr() interrupt 4
{
        if(RI==1)
        {
                Data=SBUF;
                if(Data!='\0')
                {Sbuf[i++]=Data;}
               
                uart_send(Sbuf[0]);
                uart_string(Sbuf);RI=0;

回復(fù)

使用道具 舉報(bào)

ID:232462 發(fā)表于 2023-1-21 20:11 | 顯示全部樓層
你的程序不完整。而且發(fā)送的程序不要在中,有可能造成數(shù)據(jù)沒(méi)發(fā)送完又收到新的數(shù)據(jù),會(huì)丟數(shù)據(jù)。
中斷只負(fù)責(zé)把數(shù)據(jù)送人緩沖區(qū),其他處理在主函數(shù)。
回復(fù)

使用道具 舉報(bào)

ID:883242 發(fā)表于 2023-1-23 11:18 | 顯示全部樓層
代碼不全無(wú)法分析,i怎么定義的,代碼后面如何處理i的?
回復(fù)

使用道具 舉報(bào)

ID:824490 發(fā)表于 2023-1-26 18:01 | 顯示全部樓層
Sbuf[i++],,這個(gè)i是全局變量,該不會(huì)是被其它函數(shù)修改了吧?
全局變量最好能起個(gè)有意義的、個(gè)性的名字,不然有可能會(huì)被誤操作,我看用rxd_count就不錯(cuò)
接收數(shù)據(jù)的數(shù)組Sbuf,盡量不要用系統(tǒng)關(guān)鍵字SBUF,雖然KEIL大小寫(xiě)不一樣,你無(wú)法保證會(huì)不會(huì)被誤操作,你看rxd_arr[]如何?
起名字是個(gè)學(xué)問(wèn)~~好聽(tīng)、好拼寫(xiě)、還要有意義,英文簡(jiǎn)寫(xiě)或漢語(yǔ)拼音都可以啊。不用這么懶吧?
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2023-2-9 23:58 | 顯示全部樓層
當(dāng)初學(xué)ModBus的時(shí)候?qū)懙?代碼不怎么好,但也算是正確,你參考一下
void Uart1_Isr() interrupt 4                                                //串口1中斷函數(shù)
{
        static unsigned RX_Count=0;                                                //接收到的字節(jié)數(shù)
        if(TI)                                                                                          //發(fā)送中斷
                   {                          
                         TI=0;                                          
                        busy=0;                  
                }
        //────────────────────────────────────────────────────
        if(RI)                                                                                        //接收中斷
                {       
                        RI=0;                                               
                        if((New_Cmd))                                                        //新命令
                           {
                                        New_Cmd=0;                                                //新命令標(biāo)志位清除       
                                        TR0 = 1;                                                //接收到串口信號(hào)后,定時(shí)器0開(kāi)始計(jì)時(shí)       
                                        RX_Count=0;                                                //重新指定指針位置
                                        Buffer0.cnt_Byte=0;                                //接收字節(jié)數(shù)清除                                                                       
                                }
                        Buffer0.buf_uart[RX_Count]=SBUF;                //把接收到的數(shù)據(jù)保存
                        RX_Count++;                                                                //數(shù)組指針加1
                        Buffer0.cnt_Byte++;                                                //接收字節(jié)數(shù)+1
                        T0_1ms_uart=0;                                                        //接收完一個(gè)字節(jié)數(shù)據(jù),重新計(jì)時(shí)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
                }
        //───────────────────────────────────────────────────────────                                                       
}

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表