|
我的程序中PYTHON上位機通過串口發(fā)送數(shù)據(jù)給單片機,每次發(fā)送10行,每發(fā)送一行單片機會給上位機返回一個字符,上位機收到字符后發(fā)送下一行,10行發(fā)送完成后等待單片機處理完畢后,單片機會再發(fā)送一個字符給上位機,上位機繼續(xù)傳遞下10行數(shù)據(jù),如此循環(huán)至數(shù)據(jù)發(fā)送完成。
上位機代碼如下:
try:
#端口,GNU / Linux上的/ dev / ttyUSB0 等 或 Windows上的 COM3 等
portx="COM7"
#波特率,標(biāo)準(zhǔn)值之一:50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200
bps=115200
#超時設(shè)置,None:永遠(yuǎn)等待操作,0為立即返回請求結(jié)果,其他值為等待超時時間(單位為秒)
timex=5
# 打開串口,并得到串口對象
ser=serial.Serial(portx,bps,timeout=timex)
# 寫數(shù)據(jù)到串口
j=0
for i in range(len(data1)):
j=j+1
print(data1[ i],end="")
ser.write(data1[ i].encode('UTF-8'))
msg=ser.read(1)
while(msg!=b'A'):#等待一行發(fā)送完成得到回應(yīng)A
msg=ser.read(1)
if(j ==10 ):
print("%d條代碼發(fā)送完,正在處理"%(i+1))
while(msg!=b'B'):#發(fā)完10行等待再次發(fā)送的指令B
msg=ser.read(1)
j=0
ser.write('$'.encode('UTF-8'))#寫完完畢,發(fā)結(jié)束信號
print("傳送完成完畢")
ser.close()#關(guān)閉串口
單片機串口接收程序如下:
if(RI)
{
if(recf==1)//接收g指令
{
if(SBUF)
{
recbuf[compos][recpos]=SBUF;
recpos++;
}
if(SBUF=='\n')
{
compos++;
recpos=0;
SBUF='A';//收完一行返回一個A
while(!TI)
TI=0;
if(compos==10)
{
recf=0;//暫停接收
wrif=1;//開始執(zhí)行
}
}
if(SBUF=='$')//傳送結(jié)束標(biāo)志
{
recbuf[compos][recpos]=0;
recf=0;//暫停接收
wrif=1;//開始執(zhí)行
}
RI=0;
}
}
下面是主函數(shù)while循環(huán)中的處理完10行返回一個字符給上位機
下面是問題:
每次單片機運行開始,等待上位機傳遞數(shù)據(jù)。每次傳送不一定成功,偶爾會出現(xiàn)只傳送2行就卡住不動了,單片機復(fù)位或重啟,再重新傳送才能成功。
不是每次都出現(xiàn),有時出現(xiàn)有時不出現(xiàn),故障率30%左右,自查沒找到原因,求教大佬,謝謝 |
|