久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3383|回復: 6
收起左側

STC15單片機rs485數據收發切換,數據有丟失和亂碼的問題,求指教

[復制鏈接]
ID:911776 發表于 2021-6-29 16:17 | 顯示全部樓層 |閱讀模式
STC15單片機 485數據收發切換,數據有丟失和亂碼的問題, 求指教

波特率9600, 每隔150ms發送8字節,每隔100ms收取10字節

1. 485串口數據進行發送和接收,是通過中斷來實現的;
2. 一定的頻度下,單單發送,單單接收都是正常的;
3. 當收發頻繁切換進行通訊的時候,尤其是收發的時差在60-70ms上下的時候,會出現數據有丟失和數據混亂的現象。而且這種頻度越高越容易出現。

嘗試過在收發切換的時候,延時,但是輸出數據的情況看,并沒有多大的效果
求大神指點!

附相關代碼:
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();  //加上接收數據不能正常進行
                }
}


    if (TI)
    {
        TI = 0;                 //清除TI位
                Send.cnt++;
              if(Send.cnt >= Send.strLen)
                {
                    //Delay40ms();
                    R485();
                    Send.busy = 0;               //清忙標志
                    return;
                }
                SBUF =  *(Send.pStr + Send.cnt);
    }
}
回復

使用道具 舉報

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

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:911776 發表于 2021-7-1 12:58 | 顯示全部樓層
https://www.chinafix.com/thread-137012-1-1.html
收藏今天看到的一個神貼
回復

使用道具 舉報

ID:226055 發表于 2021-7-2 17:45 | 顯示全部樓層
    可以考慮下硬件上面檢查下,比如把RS485收發芯片換成MAX系列的。
回復

使用道具 舉報

ID:883242 發表于 2021-7-2 21:29 | 顯示全部樓層
485不把協議定清楚,很難在一條線上做到收發不沖突,你的協議都沒弄好就開始擼代碼了。
回復

使用道具 舉報

ID:911776 發表于 2021-7-3 15:10 | 顯示全部樓層
本帖最后由 yhy08090 于 2021-7-3 15:31 編輯
cocolala 發表于 2021-7-2 17:45
可以考慮下硬件上面檢查下,比如把RS485收發芯片換成MAX系列的。
單單收,單單發都是OK的,會是硬件的問題?
我們的收發芯片是SP3485
回復

使用道具 舉報

ID:911776 發表于 2021-7-3 15:21 | 顯示全部樓層
本帖最后由 yhy08090 于 2021-7-3 16:44 編輯
Hephaestus 發表于 2021-7-2 21:29
485不把協議定清楚,很難在一條線上做到收發不沖突,你的協議都沒弄好就開始擼代碼了。

是類似MOBUS的軟件層協議?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕一区二区三区在线乱码 | 九九久久精品视频 | 最新日韩av | 成人黄色av网站 | 亚洲国产成人精品久久久国产成人一区 | 久久国产精品久久久久久久久久 | 毛片入口 | 视频一区二区中文字幕 | 欧美福利精品 | 亚洲一区二区中文字幕在线观看 | 精品一区二区在线看 | 一区二区三区日韩 | 日韩欧美一区二区三区免费观看 | 一区二区三区高清 | 亚洲日韩欧美一区二区在线 | 亚洲一本 | 中文字幕在线观看视频网站 | 亚洲精品二区 | 亚洲精品久久久一区二区三区 | 二区视频 | 日韩亚洲视频 | 999久久久 | 涩涩视频在线看 | 奇米四色在线观看 | 国产a区 | 精品一区二区三区在线观看国产 | 热re99久久精品国产99热 | 中文字幕一区二区三区在线观看 | 久久久久久久久久久久久久国产 | 午夜欧美日韩 | 成人性视频免费网站 | 国产成人一区二区三区 | 999久久久久久久久6666 | 美女福利视频 | 日韩成人一区 | 色妞av| 九九九久久国产免费 | 国产在线观看一区二区 | 一级做a爰片性色毛片16 | 日本视频一区二区 | 国产精品69av |