我正在通過RS485編程MCU板。我已經完成了訪問bootloader的代碼段沒有問題。我的問題是這樣的代碼:引導程序流量控制C#
int xon_off = ComPort.ReadChar();
if (xon_off == send_data) {
int counter = 0;
string line;
System.IO.StreamReader file = new System.IO.StreamReader("C:/Users/user/Desktop/x.hex");
while ((line = file.ReadLine()) != " ") // reads until end of file
{
write_line: line = file.ReadLine();
if (xon_off == send_data) {
ComPort.Write(line);
//System.Threading.Thread.Sleep(500);
counter++;
xon_off = ComPort.ReadByte(); // should be x_off
error_check = ComPort.ReadByte(); // will give line complete or error
xon_off = ComPort.ReadByte(); // should be x_on
} else if (xon_off == stop_data) {
read_again: xon_off = ComPort.ReadByte();
if (xon_off == send_data) {
goto write_line;
} else {
goto read_again;
}
}
}
我的問題是與流量控制(x_on/x_off/EOF /等)。當前代碼的方式,它可以發送一個頁面錯誤,並且該工具繼續發送,因爲它什麼也沒有,所以顯然我的讀/比較語句是關閉的。有人可以幫我找出爲什麼當它發送一個頁面錯誤,我的代碼認爲它正在發送一個x_on?
注意:x_on是一個高於0x11的變量,而x_off是一個高於0x13的變量,僅用於說明。
注意:一旦我弄清楚了這一點,我的下一步就是刪除goto語句......他們很重要我知道,但他們在這裏工作。
使用串行端口,在連接關閉之前,您不會收到EOF。不要使用流量控制,它是古老的,並且在大多數情況下不起作用。不要使用任何流量控制(既不是硬件也不是軟件)。如果你發送二進制文件,那麼做兩件事。 1)確保你的流類設置爲UTF8。默認是ASCII,這可能會給你一個像你一樣的錯誤。 2)在消息開始處添加一個字節計數,指示將跟隨多少個字節。 – jdweng
學習[問],提供[mcve]! – Olaf
我不發送二進制文件......它都是十六進制(Intel .hex文件),你必須使用一些流量控制,你必須等待xon發送,然後發送xoff或者頁面/行錯誤,你必須能夠判斷出錯時重新發送線,而且我只是通過串行發送數據,因此EOF(或EOT)位於.hex文件本身,因此程序需要能夠當它到達終點時停止加密並停止 – gergalern