基於Linux的ARM與上位機檔案傳輸

2021-06-25 23:13:06 字數 2594 閱讀 6485

關於上位機以及arm的串列埠程式設計,網上的資料很多,不過兩者**同時給出的資料卻很少,本菜鳥經過幾天時間的煎熬,終於實現了用自己編寫的上位機軟體傳輸檔案到arm板上。上位機使用的是c#,arm上使用的是linux c,使用的檔案傳輸協議為xmodem。關於xmodem協議的格式可以參考我前面轉的一篇部落格,這裡就不細說了。

下面首先貼出**:

/******arm上的應用程式******/

#include #include #include #include #include #include #include #include #include #include #include unsigned char buf[132];

int debug_buf[132];

int i;

//列印出接收到的資料(除錯時用)

void print_data_package()

printf("\n");

printf("\n");

}//初始化串列埠

void uart_init()

if(isatty(fd) == 0)

if(tcgetattr(fd, &tmp_term) < 0)

tmp_term.c_cflag = cs8|cread|hupcl|clocal;

tmp_term.c_oflag = 0;

tmp_term.c_iflag = ixany|ignbrk|ignpar;

tmp_term.c_lflag = 0;

tmp_term.c_cc[vmin]=132; //read函式最少讀到132位元組資料才返回,否則保持阻塞,以此保證資料報的完整性

tmp_term.c_cc[vtime]=0;

cfsetispeed(&tmp_term,b115200); //設定波特率

cfsetospeed(&tmp_term,b115200);

if(tcsetattr(fd, tcsaflush, &tmp_term) < 0)

close(fd);

}int main(int argc, char** argv)

read(dev_fd,buf,132); //接收第乙個資料報

if(buf[0]==0x01) //接收到第乙個soh訊號

if(check_sum==buf[131]) //校驗和正確

else

}else

}printf("eot received\n");

printf("\n");

signal[0]=0x06;

write(dev_fd,signal,1); //傳送ack訊號

printf("ack sent\n");

close(dev_fd);

close(file_fd);

return 0;

} else

}

/******上位機軟體傳送按鈕對應的c#********/

private void btnsend_click(object sender, eventargs e)

sendpackage:

sp.discardoutbuffer(); //清空串列埠輸出緩衝區

sp.write(datapackage, 0, 132); //傳送資料報

signal[0] = (byte)sp.readbyte();

if (signal[0] == 0x06) //收到ack訊號

else if (signal[0] == 0x15) //收到nak訊號

else

array.clear(datapackage, 0, 132); //清空資料報

}signal[0] = 0x04; //eot訊號

sp.write(signal, 0, 132); //傳送eot訊號

if (sp.readbyte() == 0x06) //收到ack訊號

else

}else

}

下面講講程式設計中遇到的問題。遇到的乙個主要問題是:乙個132位元組的資料報有時候會被分兩次接收,也就是說第一次buf中接收到的是資料報的前一部分資料,第二次接收到的是後一部分資料,因此兩次資料報都不正確,此現象迴圈往復,導致資料報不斷重發,檔案永遠無法傳輸成功。

沒有經驗的我百思不得其解,查閱了眾多資料,反覆除錯,終於找到了原因。原因就出在串列埠的c_cc[vmin]和c_cc[vtime]引數上。關於c_cc[vmin]和c_cc[vtime]的設定網上資料很多,這裡就不貼了,下面我僅以乙個例子說明在c_cc[vtime]=0時c_cc[vmin]的作用。

假設c_cc[vmin]=10,c_cc[vtime]=0,read函式的第三個引數給的是15,此時程式已經執行到read函式讀取串列埠裝置檔案,下面分情況討論:

若串列埠接收緩衝區中的資料量小於10位元組,則read函式阻塞等待,直至緩衝區接收到10位元組資料,然後讀取並返回;

若串列埠接收緩衝區中的資料量大於等於10位元組,且小於等於15,則read函式讀取串列埠接收緩衝區的全部資料並返回;

若串列埠接收緩衝區中的資料量大於15位元組,則read函式讀取串列埠接收緩衝區的前15位元組並返回。

上位機與下位機

上位機一般是集中管理監控機,下位機是指現場直接控制器或控制機。上位機面向管理級使用者,下位機面向底層裝置控制。上位機 上位監視系統,一般為計算機系統 監控軟體 下位機 控制系統的現場執行系統,一般為plc等裝置。上位機是指人可以直接發出操控命令的計算機,一般是pc,螢幕上顯示各種訊號變化 液壓,水位...

基於MFC的 CYPRESS USB上位機除錯記錄

問題1 1 已啟動生成 專案 usbdetect,配置 debug win32 1 正在編譯.1 usbdetectdlg.cpp 1 c project usbdetect usbdetect usbdetectdlg.cpp 181 error c2664 cwnd setdlgitemtext...

基於VS C 的上位機開發之串列埠(一)

工具 vs2012,下位機 具備串列埠功能的 要求 1.有一定的c c 基礎,更容易理解 2.有微控制器開發經驗,這樣除錯起來更容易比如串列埠的程式設計以及串列埠助手的使用以及相關除錯 功能說明 1.選擇外部輸入的com口,並且根據需要選擇波特率 2.帶有錯誤提醒機制 3.接收和傳送 字元模式和數值...