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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

問一個單片機串口通訊數(shù)據(jù)丟位的問題

查看數(shù): 3497 | 評論數(shù): 19 | 收藏 0
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2019-6-7 20:33

正文摘要:

問題說明:我設置的波特率是9600,然后這個程序就是筆記本發(fā)送數(shù)據(jù)給單片機,單片機馬上原封不動地發(fā)送回去,但是在發(fā)送回來的時候發(fā)現(xiàn)缺位了,比如說我發(fā)送了一串數(shù)字2019060720055905,但是傳回來的時候有時候就少 ...

回復

ID:207421 發(fā)表于 2019-6-8 12:37
哪里抄的代碼,代碼中很多錯誤
串口通信注意的是:
1. 晶振的誤差會導致數(shù)據(jù)發(fā)生錯誤
2. 發(fā)送速度的快慢, 一個巴掌扇過去,那個人還沒來得及回復你,你又一個巴掌,他做啞巴得了,你白問了.
3. 沒有對數(shù)據(jù)進行校驗的函數(shù)
4. 接收或發(fā)送數(shù)據(jù)時,  沒有進行ES或EA處理,不就存在BUG了么
ID:557163 發(fā)表于 2019-6-8 22:57
這么改
1. 漏了個分號
void SendByte(uchar dat)
{
        SBUF = dat;
        while(!TI);  // 這里加上分號
        TI=0;
}

2.  中斷服務程序的收發(fā)看似沒問題,當單片機的波特率比電腦略低時,有一定的概率上一個字節(jié)發(fā)送還沒完下一個字節(jié)就收到了,簡單粗暴的改法是
把   SBUF=temp;
改為  SendByte(temp);
ID:523537 發(fā)表于 2019-6-11 00:03
yumer 發(fā)表于 2019-6-10 11:39
串口通訊的時間是最主要的,要保證兩個通訊的頻率是一樣的,其次對于發(fā)射和接受的延時等待時間也要一致

嗯嗯,確實是這樣,多謝指教了!
ID:243060 發(fā)表于 2019-6-10 11:39
串口通訊的時間是最主要的,要保證兩個通訊的頻率是一樣的,其次對于發(fā)射和接受的延時等待時間也要一致
ID:523537 發(fā)表于 2019-6-10 09:55
闊愛的釗釗 發(fā)表于 2019-6-10 01:01
波特率和檢驗的問題,小老弟串口不要用人家的源碼呀,bug多得嚇死人喲,還占資源

自己也是剛學,很多東西都不太懂,只好在源碼上做簡單修改
ID:222006 發(fā)表于 2019-6-10 01:01
波特率和檢驗的問題,小老弟串口不要用人家的源碼呀,bug多得嚇死人喲,還占資源
ID:552783 發(fā)表于 2019-6-9 21:13
我覺得可以加個校驗
ID:523537 發(fā)表于 2019-6-9 14:12
he_37 發(fā)表于 2019-6-8 22:57
這么改
1. 漏了個分號
void SendByte(uchar dat)

更有意思的是我整個串口中斷程序沒有把TI置0也可以進行串口通訊,只是也有丟位。
void UART_SER() interrupt 4
{
        uchar temp;
        if(RI)
        {
                RI = 0;
                temp = SBUF;
                SBUF = temp;
                /*下面兩個語句就是SendByte(uchar dat)的功能*/
                while(!TI);
        }
}

ID:523537 發(fā)表于 2019-6-9 14:06
he_37 發(fā)表于 2019-6-8 22:57
這么改
1. 漏了個分號
void SendByte(uchar dat)

分號是我復制粘貼上來的時候不小心刪掉了,不過我想了下你的改法應該是對的,后面我嘗試了下也確實是對的,沒有出現(xiàn)過一次丟包,不過我又有了一個新問題,我先把代碼復制上來吧。void UART_SER() interrupt 4{
        uchar temp;
        if(RI)
        {
                RI = 0;
                temp = SBUF;
                SBUF = temp;
                /*下面兩個語句就是SendByte(uchar dat)的功能*/
                while(!TI);
                TI = 0;
        }
}


我是這么想的,電腦發(fā)送了一個8位數(shù)據(jù)過來,單片機接收端的SBUF接收了,然后我把數(shù)據(jù)轉(zhuǎn)給了發(fā)送端的SBUF,然后就是while(!TI);等待單片機發(fā)送完,但是我的串口中斷還是開的,那么當單片機數(shù)據(jù)發(fā)送完TI置1,那么就會觸發(fā)中斷,然后又從中斷函數(shù)開頭uchar temp;開始,那么而且我也把TI=0;語句刪了,那么按道理就是應該無限循環(huán)啊,為啥還會完整把整個數(shù)據(jù)接收完呢?我現(xiàn)在也搞不懂了。
ID:519141 發(fā)表于 2019-6-8 19:34
數(shù)據(jù)傳輸開始和完成都需要有確認語句,方可進行下一步的操作
ID:523537 發(fā)表于 2019-6-8 19:16
lele5211314 發(fā)表于 2019-6-8 17:30
數(shù)碼管用定時器0,串口的用定時器1

我數(shù)碼管確實用的是定時器0,串口用的是定時器1啊
ID:523537 發(fā)表于 2019-6-8 19:15
xuyaqi 發(fā)表于 2019-6-8 08:35
發(fā)送雙方都要給對方留出處理信息的時間。

那需要在哪里加延時函數(shù)呢?
ID:523537 發(fā)表于 2019-6-8 19:14
lwh999995 發(fā)表于 2019-6-8 12:37
哪里抄的代碼,代碼中很多錯誤
串口通信注意的是:
1. 晶振的誤差會導致數(shù)據(jù)發(fā)生錯誤

這個代碼是我參照例子寫的。首先我用的是11.0592MHz的晶振,波特率9600,我想問下需要延時要在哪里加_nop_()函數(shù)呢?另外我這個因為是電腦和單片機通訊,為了簡單一點所以沒有校驗,最后接受和發(fā)送數(shù)據(jù)的時候要關(guān)閉總中斷來避免多個中斷干擾數(shù)據(jù)傳輸嗎?
ID:93224 發(fā)表于 2019-6-8 17:30
數(shù)碼管用定時器0,串口的用定時器1
ID:259083 發(fā)表于 2019-6-8 17:09
可能是兩個單片機的波特率誤差導致的,你可以換幾組波特率試試,如果還是不行,最好加CRC 校驗等校驗模式進行校驗,也可以考慮采用糾錯碼來糾正誤碼!
ID:557425 發(fā)表于 2019-6-8 11:42

發(fā)送雙方都要給對方留出處理信息的時間。



ID:94031 發(fā)表于 2019-6-8 08:35
發(fā)送雙方都要給對方留出處理信息的時間。
ID:523537 發(fā)表于 2019-6-8 06:14
懇請各位大佬指點

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久亚洲一区二区三区四区 | 一级片av | 在线国产一区 | 欧美日本高清 | 亚洲69p | 久久久精品一区 | 亚洲一区在线观看视频 | 精品久久99 | 国产精品av久久久久久久久久 | 国产精品国产成人国产三级 | 在线观看国产视频 | 色一情一乱一伦一区二区三区 | 99久久久无码国产精品 | 国产精品久久久久一区二区三区 | 欧美日韩视频一区二区 | 91大神在线资源观看无广告 | 欧美日韩亚洲三区 | 久久亚洲一区 | 日韩精品一区二区在线观看 | 91视视频在线观看入口直接观看 | 国产精品一区二区免费看 | 亚洲自拍一区在线观看 | 欧美一区二区久久 | 亚洲精品一区二三区不卡 | 一级毛片网 | 国产精品久久久久久久久久久久冷 | а√中文在线8 | 午夜免费看 | 午夜视频在线 | www.狠狠干| 亚洲视频国产视频 | 秋霞av国产精品一区 | 欧美国产日韩精品 | 欧美精品一区二区三区在线播放 | 欧美日韩在线免费观看 | 伊人操| 国产99免费 | 成人视屏在线观看 | 欧美一区二区在线 | av色在线| 亚洲视频一区二区三区 |