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

QQ登錄

只需一步,快速開始

搜索
查看: 3391|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

STC15單片機(jī)rs485數(shù)據(jù)收發(fā)切換,數(shù)據(jù)有丟失和亂碼的問題,求指教

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:911776 發(fā)表于 2021-6-29 16:17 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
STC15單片機(jī) 485數(shù)據(jù)收發(fā)切換,數(shù)據(jù)有丟失和亂碼的問題, 求指教

波特率9600, 每隔150ms發(fā)送8字節(jié),每隔100ms收取10字節(jié)

1. 485串口數(shù)據(jù)進(jìn)行發(fā)送和接收,是通過中斷來(lái)實(shí)現(xiàn)的;
2. 一定的頻度下,單單發(fā)送,單單接收都是正常的;
3. 當(dāng)收發(fā)頻繁切換進(jìn)行通訊的時(shí)候,尤其是收發(fā)的時(shí)差在60-70ms上下的時(shí)候,會(huì)出現(xiàn)數(shù)據(jù)有丟失和數(shù)據(jù)混亂的現(xiàn)象。而且這種頻度越高越容易出現(xiàn)。

嘗試過在收發(fā)切換的時(shí)候,延時(shí),但是輸出數(shù)據(jù)的情況看,并沒有多大的效果
求大神指點(diǎn)!

附相關(guān)代碼:
void Send1StrWithLen(uchar *s, uchar len)
{
    if(len <= 0)
    {
        return;
    }

    if(Send.busy)
    {
        return;
    }
   
    if(Recv.busy)
    {
        return;
    }

    T485();
    //Delay5ms();   
    Send.strLen = len;
    Send.pStr = s;
    SBUF = *(Send.pStr);
    Send.busy = 1;
    Send.cnt = 0;
}


void Uart1ISR() interrupt 4
{

    if (RI)
    {
        RI = 0;                 //清除RI位
                Recv.dat = SBUF;
                RecCmd[Recv.cnt] = Recv.dat;
                if(Recv.cnt == 0)
                {
                    Recv.busy = 1;
                }
                Recv.cnt++;
                if(Recv.cnt >= CMD_LEN)
                {
                    Recv.cnt = 0;
                    Recv.busy = 0;
                    Recv.endFlag = 1;
                    //T485();  //加上接收數(shù)據(jù)不能正常進(jìn)行
                }
}


    if (TI)
    {
        TI = 0;                 //清除TI位
                Send.cnt++;
              if(Send.cnt >= Send.strLen)
                {
                    //Delay40ms();
                    R485();
                    Send.busy = 0;               //清忙標(biāo)志
                    return;
                }
                SBUF =  *(Send.pStr + Send.cnt);
    }
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:123289 發(fā)表于 2021-6-30 17:43 | 只看該作者
串口串來(lái)數(shù)據(jù)是連續(xù)的,它不等人!如果你不及時(shí)取走,就丟數(shù)據(jù)了!!
教你一下如何發(fā)送吧:
1、開辟一個(gè)發(fā)送緩沖區(qū)A,用于存放需要發(fā)送的數(shù)據(jù),例如:發(fā)送緩沖區(qū)大小=256個(gè)字節(jié),則可以放置送256個(gè)字符。采循環(huán)放置,無(wú)需擦除,循環(huán)時(shí)覆蓋。如果能及時(shí)發(fā)送,則數(shù)據(jù)量無(wú)限!
2、建立兩個(gè)指針:PCW(寫入指針)、PCR(取走指針)它倆同時(shí)指向A區(qū)的數(shù)據(jù)位置。初始PCW=PCR=0,同時(shí)指向A區(qū)首字節(jié)。PCW、PCR最大=255(指向最后一個(gè)字節(jié)),再多即=256時(shí),就歸0(循環(huán)計(jì)數(shù))。
3、當(dāng)你需要發(fā)送一組字符時(shí)(如"ABCDEFG"),就將"ABCDEFG" 依序?qū)懭階區(qū)PCW所指的地方,且每寫一個(gè),將PCW+1。注意:這時(shí)僅僅是寫入A區(qū)并未真正的發(fā)送!PCW=256時(shí)要?dú)w0!
4、發(fā)送:當(dāng)PCR<>PCW時(shí),就從A區(qū)中取出一個(gè)PCR指向的字節(jié)發(fā)送出去,發(fā)完后,將PCR+1。
提示:這段程序可以寫在發(fā)送中斷程序中,每次發(fā)送中斷只發(fā)一個(gè)數(shù)據(jù)。下次中斷再發(fā)下一個(gè),不等待。
這樣做的好處是:
A、發(fā)送時(shí)不需考慮系統(tǒng)忙不忙,因?yàn)槟阒幌駻區(qū)寫數(shù)據(jù),不存在忙不忙。
B、只要PCW改變就可能引起PCR<>PCW,也就起動(dòng)了發(fā)送。
C、串口發(fā)送是中斷一次發(fā)一個(gè)字節(jié),也不需檢驗(yàn)系統(tǒng)忙不忙,只要PCR<>PCW就發(fā)一個(gè),發(fā)了一個(gè)字節(jié)就退出。不需要發(fā)送等待,節(jié)省的CPU的時(shí)間,所以永遠(yuǎn)不會(huì)影響接收數(shù)據(jù),也就丟不掉接收的數(shù)據(jù)了。
5、第一個(gè)字節(jié)數(shù)據(jù):發(fā)送中斷只發(fā)生于數(shù)據(jù)發(fā)送之后,那么第一個(gè)字節(jié)在發(fā)送之前是不會(huì)有發(fā)送中斷發(fā)生的!那么第一個(gè)字節(jié)需要如何發(fā)送呢?這里留個(gè)懸案,讓樓上自己解決。
以上也是我用于實(shí)戰(zhàn)的方案,從未丟過任何一個(gè)數(shù)據(jù)。原因就是收、發(fā)數(shù)據(jù)時(shí)間最短,沒有等待。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:911776 發(fā)表于 2021-7-1 12:58 | 只看該作者
https://www.chinafix.com/thread-137012-1-1.html
收藏今天看到的一個(gè)神貼
回復(fù)

使用道具 舉報(bào)

地板
ID:226055 發(fā)表于 2021-7-2 17:45 | 只看該作者
    可以考慮下硬件上面檢查下,比如把RS485收發(fā)芯片換成MAX系列的。
回復(fù)

使用道具 舉報(bào)

5#
ID:883242 發(fā)表于 2021-7-2 21:29 | 只看該作者
485不把協(xié)議定清楚,很難在一條線上做到收發(fā)不沖突,你的協(xié)議都沒弄好就開始擼代碼了。
回復(fù)

使用道具 舉報(bào)

6#
ID:911776 發(fā)表于 2021-7-3 15:10 | 只看該作者
本帖最后由 yhy08090 于 2021-7-3 15:31 編輯
cocolala 發(fā)表于 2021-7-2 17:45
可以考慮下硬件上面檢查下,比如把RS485收發(fā)芯片換成MAX系列的。
單單收,單單發(fā)都是OK的,會(huì)是硬件的問題?
我們的收發(fā)芯片是SP3485
回復(fù)

使用道具 舉報(bào)

7#
ID:911776 發(fā)表于 2021-7-3 15:21 | 只看該作者
本帖最后由 yhy08090 于 2021-7-3 16:44 編輯
Hephaestus 發(fā)表于 2021-7-2 21:29
485不把協(xié)議定清楚,很難在一條線上做到收發(fā)不沖突,你的協(xié)議都沒弄好就開始擼代碼了。

是類似MOBUS的軟件層協(xié)議?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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