2016-02-08 45 views
-1

我正在通過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語句......他們很重要我知道,但他們在這裏工作。

+1

使用串行端口,在連接關閉之前,您不會收到EOF。不要使用流量控制,它是古老的,並且在大多數情況下不起作用。不要使用任何流量控制(既不是硬件也不是軟件)。如果你發送二進制文件,那麼做兩件事。 1)確保你的流類設置爲UTF8。默認是ASCII,這可能會給你一個像你一樣的錯誤。 2)在消息開始處添加一個字節計數,指示將跟隨多少個字節。 – jdweng

+0

學習[問],提供[mcve]! – Olaf

+0

我不發送二進制文件......它都是十六進制(Intel .hex文件),你必須使用一些流量控制,你必須等待xon發送,然後發送xoff或者頁面/行錯誤,你必須能夠判斷出錯時重新發送線,而且我只是通過串行發送數據,因此EOF(或EOT)位於.hex文件本身,因此程序需要能夠當它到達終點時停止加密並停止 – gergalern

回答

1

好吧,從我所能理解的,下面是更好的選擇是: 首先,刪除goto語句,他們是horrindious,不應該使用。至於不能混合字符/十六進制值的問題,每個字符作爲int引入時將被賦予十六進制值(在程序中轉換爲int32)。當引導加載程序發送0x11時,它將很可能將其作爲字符發送,它將作爲不可打印的ASCII字符進入您的軟件,但如果使用調試程序並看看它實際上是以什麼形式出現的話,仍然有0x11。所以我的建議是做一個readbyte,然後在軟件中進行int32轉換,併爲你想做的事情做一個switch語句/狀態機。

+0

有道理,我會嘗試一下,如果需要更新! – gergalern