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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3022|回復: 4
打印 上一主題 下一主題
收起左側

關于單片機與Python上位機通信問題

[復制鏈接]
跳轉到指定樓層
樓主
100黑幣
上位機用的PYTHON網上抄的程序,用于將G指令傳遞給單片機
目前存在的問題如下:
1、單片機有時會在一行指令中少收一兩個字符(小概率),為什么會丟字符?這個沒查到原因,求指教
2、單片機返回給PC端用于交互的字符有時上位機也收不到,可能原因是什么?
下面附串口接收代碼:
  1. if(RI)
  2. {
  3.   if(recf==1)//接收g指令
  4.   {
  5.    recbuf[compos][recpos]=SBUF;//數據存入緩存
  6.    recpos++;
  7.    if(SBUF=='\n')        //如果收到的是\n,說明接收完一行
  8.    {
  9.     if(recbuf[compos][0]==(recpos-1))//接收一行的第一個字符是本行字符數,此處確認接收和發送數目相等,-1是首字符記錄個數
  10.     {
  11.      SBUF='A';//收完一行返回一個A
  12.      while(!TI)
  13.       TI=0;
  14.      recpos=0;   //接收完一行,將接收位置重置,接收數組+1
  15.      compos++;
  16.      if(compos==10)//已經接收10行,暫停接收,置位處理數據flag
  17.      {
  18.       recf=0;//暫停接收
  19.       wrif=1;//開始執行
  20.      }
  21.     }
  22.     else            //接收發送數目不一致,通知上位機重新發送
  23.     {
  24.      SBUF='E';
  25.      while(!TI)
  26.       TI=0;
  27.      recpos=0;//準備重新接收
  28.     }
  29.    }
  30.    if(SBUF=='
  31. 下面是Python上位機程序:
  32. import serial #導入模塊

  33. <div class="blockcode"><blockquote>f1=open('1.gcode','r')   #輸入.mmg刀具路徑
  34. data1=f1.readlines()
  35. f1.close()
  36. try:
  37.   #端口,GNU / Linux上的/ dev / ttyUSB0 等 或 Windows上的 COM3 等
  38.   portx="COM7"
  39.   #波特率,標準值之一:50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200
  40.   bps=9600#115200
  41.   #超時設置,None:永遠等待操作,0為立即返回請求結果,其他值為等待超時時間(單位為秒)
  42.   timex=5
  43.   # 打開串口,并得到串口對象
  44.   ser=serial.Serial(portx,bps,timeout=timex)
  45.   # 寫數據到串口
  46.   j=0
  47.   for i in range(len(data1)):
  48.     j=j+1
  49.     print(data1[i],end="")#打印數據到屏幕,便于觀察
  50.     ser.write(chr(len(data1[i])).encode('UTF-8'))#寫本行長度到串口
  51.     result=ser.write(data1[i].encode('UTF-8'))#寫本行數據到串口
  52.     print(result)#打印本行字符數,包括\n
  53.     msg=ser.read(1)#讀取串口,單片機返回值
  54.     print(msg)
  55.     while(msg==b'E'):#發送與接收不一致,重新發送本行
  56.       ser.write(chr(len(data1[i])).encode('UTF-8'))
  57.       ser.write(data1[i].encode('UTF-8'))
  58.       msg=ser.read(1)
  59.       print(msg)
  60.     while(msg!=b'A'):#等待一行發送完成得到回應A
  61.       msg=ser.read(1)
  62.       print(msg)
  63.     if(j ==10 ):#發送完10行,等待單片機處理完畢,返回B再繼續發送下10行
  64.       print("%d條代碼發送完,正在等待處理"%(i+1))
  65.       while(msg!=b'B'):#發完10行等待再次發送的指令B
  66.         msg=ser.read(1)
  67.         j=0
  68.         
  69.   ser.write('

  70. 下面是傳送情況,不一定卡在什么位置,程序有確定性找不到原因,求教大神們
  71. <img src="http://www.zg4o1577.cn/bbs/forum.php?mod=image&aid=269927&size=300x300&key=85739febd9026e1e&nocache=yes&type=fixnone" aid="attachimg_269927" alt="" border="0" width="300"><img src="http://www.zg4o1577.cn/bbs/forum.php?mod=image&aid=269928&size=300x300&key=e3e4704a245fc88b&nocache=yes&type=fixnone" aid="attachimg_269928" alt="" border="0" width="300">

  72. )//傳送結束標志
  73.    {
  74.     recbuf[compos][recpos]=0;
  75.     recf=0;//暫停接收
  76.     wrif=1;//開始執行
  77.    }
  78.    RI=0;
  79.   }
  80. }
復制代碼

下面是Python上位機程序:
import serial #導入模塊

[        DISCUZ_CODE_1        ]

下面是傳送情況,不一定卡在什么位置,程序有確定性找不到原因,求教大神們


.encode('UTF-8'))#寫完完畢,發結束信號
  print("傳送完成完畢")  
  ser.close()#關閉串口
except Exception as e:
    print("---異常---:",e)


下面是傳送情況,不一定卡在什么位置,程序有確定性找不到原因,求教大神們


)//傳送結束標志
   {
    recbuf[compos][recpos]=0;
    recf=0;//暫停接收
    wrif=1;//開始執行
   }
   RI=0;
  }
}
下面是Python上位機程序:
import serial #導入模塊

[        DISCUZ_CODE_1        ]

下面是傳送情況,不一定卡在什么位置,程序有確定性找不到原因,求教大神們


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:827243 發表于 2021-5-8 10:54 | 只看該作者
你讀SBUF寫的不太規范,可能會導致多讀一個字符。改成下面試試
   recbuf[compos][recpos]=SBUF;//數據存入緩存
   recpos++;
   if(recbuf[compos][recpos-1]=='\n')        //如果收到的是\n,說明接收完一行
回復

使用道具 舉報

板凳
ID:889094 發表于 2021-5-8 11:02 | 只看該作者
daemondong 發表于 2021-5-8 10:54
你讀SBUF寫的不太規范,可能會導致多讀一個字符。改成下面試試
   recbuf[compos][recpos]=SBUF;//數據存 ...

謝謝回復,確實是問題,我修改一下
回復

使用道具 舉報

地板
ID:889094 發表于 2021-5-8 21:33 | 只看該作者
我好像找到問題原因了,主要是在發送串口數據中,仔細學習了芯片手冊,發送例程里面有一個busy還幫助獲取串口發送狀態,加進去后就沒再出現卡在半路的情況。
也沒再出現接收丟失數據現象,看來接收和發送兩個還是相關聯的?還是我程序本來就亂。。。。。
總結:
1、看例程要仔細,重點地方要做筆記
2、自己寫代碼一定要結構清楚,注釋清楚
回復

使用道具 舉報

5#
ID:889094 發表于 2021-5-8 22:28 | 只看該作者
if(TI)
{
  TI=0;
  busy=0;
}
重點中地重點,就在這個busy上面,每次發送之前:while(busy);busy=1;然后SBUF='A',如此才能確保發送時一定能發,發了一定會發出。
原來程序里面接收數據有問題估計也是因為穿插其中的發送使整個數據出問題了
現在幾百行數據做過去幾次了,再沒出現狀況。g指令傳到單片機,單片機控制步進電機,總算出來幾個字了

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产一区二区三区 | 久久网站黄 | 亚洲免费在线播放 | www.伊人.com | 日韩精品一二三 | 久久久久网站 | 色偷偷噜噜噜亚洲男人 | 国产在线一区二区三区 | 992人人草| 欧美综合视频 | 日本免费一区二区三区四区 | 国产欧美视频一区二区 | 欧美freesex黑人又粗又大 | 亚洲视频精品在线 | 污免费网站 | 久久免费精品 | 国产高清精品一区二区三区 | 国产精品久久性 | 日本aⅴ中文字幕 | 人人玩人人添人人澡欧美 | www.久久精品| 免费av播放 | 青草福利 | 爱操av| 亚洲成人免费观看 | 99久久精品国产毛片 | 国产美女特级嫩嫩嫩bbb片 | 精品久久久久一区 | 日韩一区在线播放 | 一区二区三区在线电影 | 久久久高清 | 在线免费黄色小视频 | 欧美久久不卡 | 精品成人在线视频 | 欧美一区在线视频 | 先锋av资源在线 | 久久最新精品视频 | 噜噜噜色网 | 99在线资源 | 91麻豆精品国产91久久久更新资源速度超快 | 久久精品一二三影院 |