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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關(guān)于單片機(jī)與Python上位機(jī)通信問題

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

  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.   #波特率,標(biāo)準(zhǔn)值之一:50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200
  40.   bps=9600#115200
  41.   #超時(shí)設(shè)置,None:永遠(yuǎn)等待操作,0為立即返回請求結(jié)果,其他值為等待超時(shí)時(shí)間(單位為秒)
  42.   timex=5
  43.   # 打開串口,并得到串口對(duì)象
  44.   ser=serial.Serial(portx,bps,timeout=timex)
  45.   # 寫數(shù)據(jù)到串口
  46.   j=0
  47.   for i in range(len(data1)):
  48.     j=j+1
  49.     print(data1[i],end="")#打印數(shù)據(jù)到屏幕,便于觀察
  50.     ser.write(chr(len(data1[i])).encode('UTF-8'))#寫本行長度到串口
  51.     result=ser.write(data1[i].encode('UTF-8'))#寫本行數(shù)據(jù)到串口
  52.     print(result)#打印本行字符數(shù),包括\n
  53.     msg=ser.read(1)#讀取串口,單片機(jī)返回值
  54.     print(msg)
  55.     while(msg==b'E'):#發(fā)送與接收不一致,重新發(fā)送本行
  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'):#等待一行發(fā)送完成得到回應(yīng)A
  61.       msg=ser.read(1)
  62.       print(msg)
  63.     if(j ==10 ):#發(fā)送完10行,等待單片機(jī)處理完畢,返回B再繼續(xù)發(fā)送下10行
  64.       print("%d條代碼發(fā)送完,正在等待處理"%(i+1))
  65.       while(msg!=b'B'):#發(fā)完10行等待再次發(fā)送的指令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. )//傳送結(jié)束標(biāo)志
  73.    {
  74.     recbuf[compos][recpos]=0;
  75.     recf=0;//暫停接收
  76.     wrif=1;//開始執(zhí)行
  77.    }
  78.    RI=0;
  79.   }
  80. }
復(fù)制代碼

下面是Python上位機(jī)程序:
import serial #導(dǎo)入模塊

[        DISCUZ_CODE_1        ]

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


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


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


)//傳送結(jié)束標(biāo)志
   {
    recbuf[compos][recpos]=0;
    recf=0;//暫停接收
    wrif=1;//開始執(zhí)行
   }
   RI=0;
  }
}
下面是Python上位機(jī)程序:
import serial #導(dǎo)入模塊

[        DISCUZ_CODE_1        ]

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


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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

板凳
ID:889094 發(fā)表于 2021-5-8 11:02 | 只看該作者
daemondong 發(fā)表于 2021-5-8 10:54
你讀SBUF寫的不太規(guī)范,可能會(huì)導(dǎo)致多讀一個(gè)字符。改成下面試試
   recbuf[compos][recpos]=SBUF;//數(shù)據(jù)存 ...

謝謝回復(fù),確實(shí)是問題,我修改一下
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

5#
ID:889094 發(fā)表于 2021-5-8 22:28 | 只看該作者
if(TI)
{
  TI=0;
  busy=0;
}
重點(diǎn)中地重點(diǎn),就在這個(gè)busy上面,每次發(fā)送之前:while(busy);busy=1;然后SBUF='A',如此才能確保發(fā)送時(shí)一定能發(fā),發(fā)了一定會(huì)發(fā)出。
原來程序里面接收數(shù)據(jù)有問題估計(jì)也是因?yàn)榇┎迤渲械陌l(fā)送使整個(gè)數(shù)據(jù)出問題了
現(xiàn)在幾百行數(shù)據(jù)做過去幾次了,再?zèng)]出現(xiàn)狀況。g指令傳到單片機(jī),單片機(jī)控制步進(jìn)電機(jī),總算出來幾個(gè)字了

回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人三级在线播放 | 日本久久久久久久久 | 成人亚洲精品 | 久久国产精品99久久久久久丝袜 | 欧美在线精品一区 | 欧美一区二区在线观看 | 在线观看国产视频 | 亚洲永久 | 精品视频一区二区在线观看 | 91综合网| 国产精品福利在线观看 | 欧美成人a∨高清免费观看 91伊人 | 精品国产欧美一区二区三区不卡 | 日韩成人影院在线观看 | 午夜影院在线观看版 | 久久com| 在线观看精品 | 中文字幕第十页 | 国产精品永久免费 | 激情综合五月 | 成人久久久久 | 欧美a在线看 | 欧美综合一区二区三区 | 国产精品区二区三区日本 | 亚洲精品99久久久久久 | 青青操91| 午夜视频在线观看网址 | 一区二区日韩 | 精品视频www | 日韩视频精品在线 | 国产精品一区免费 | 韩国精品在线 | 成年人黄色一级毛片 | 欧美日韩福利视频 | 亚洲成人精品在线观看 | 69av网 | 在线欧美激情 | 91中文字幕| 久久久久国产一区二区三区 | 一区二区视频在线 | 欧美日高清视频 |