2014-09-03 163 views
-1

我試圖運行使用串口的跑步機,但我能夠使用matlab做到這一點,但是當我將相同的代碼移植到C#時,我遇到了一些問題。我確信端口是開放的,可能是信息格式有問題。如果有人能告訴我我正在犯什麼錯誤,那將會很棒。下面給出了matlab代碼(工作原理)和C#代碼(不起作用)。C#通過串口傳遞消息

MATLAB代碼:MATLAB代碼的

ctr = char(12); %control character 
rel = char(169); %release 
set_speed = char(163); 
set_dir = char (184); 

%initializing the ports 
R = serial('COM4'); 
set(R, 'BaudRate', 4800, 'Parity', 'none', 'DataBits', 8, 'StopBits', 1, 'Terminator', 'CR'); 
set(R, 'InputBufferSize', 128, 'OutputBufferSize', 128); 
fopen(R); 


if R.status == 'open' 
    fprintf(R, [rel ctr]);  
    disp('port for R belt open and released'); 
else 
    disp('error with R port-- COM3'); 
end; 


%initial direction to FORWARD 
fprintf(R, [set_dir '0' char(12)]); 

%set speed to 
fprintf(R, [set_speed '0005' ctr]); 

我的C#版本以上

char ctr = (char)12; 
char rel = (char)169; //release 
char set_speed = (char)163; 
char set_dir = (char)184; 

void Start() { 

    try{ 

     SerialPort R = new SerialPort(); 
     R.BaudRate = 4800; 
     R.Parity = Parity.None; 
     R.DataBits = 8; 
     R.StopBits = StopBits.One; 
     R.ReadBufferSize = 128; 
     R.WriteBufferSize = 128; 


     R.Open(); 



     if(R.IsOpen){ 
      //Release 
      R.Write(rel+""+ctr); 
      print ("Serial port is open"); 
     } 
     else print ("Serial port is close"); 

     R.Write(set_dir+""+"0"+""+ctr); 

     R.Write(set_speed+""+"0005"+""+ctr); 
    } 
    catch(UnityException e){ 
     print ("Exception"); 
     print (e);  

    } 



} 
+0

是否有錯誤訊息? 「它不工作」是什麼意思? – 2014-09-03 20:46:51

+0

另外,什麼是「打印」?如果您嘗試寫入控制檯,請使用Console.WriteLine()。 – 2014-09-03 20:47:45

+0

至少添加錯誤消息或任何不工作的描述... – Kris 2014-09-03 20:49:12

回答

0

我不是很熟悉C#,但我會嘗試猜你也應該送終止符 C#代碼中的字符。

檢查fprintf (serial)文檔中MatLab的:

fprintf中(OBJ, '加利福尼亞')字符串CMD寫入到連接到串行端口對象的裝置中,物鏡。默認格式是%s \ n。寫操作是同步的,並在執行完成之前阻止命令行。
fprintf(obj,'format','cmd')使用格式指定的格式寫入字符串。

在您的通話使用的是1號語法,這樣您的通話

fprintf(R, [rel ctr]); 

實際上

fprintf(R, '%s\n', [rel ctr]); 

通常,串口設備讀取輸入數據直至終止字符被發現。這意味着命令字符串或數據的傳輸已完成,設備現在可以執行該命令。這非常類似於在MatLab命令窗口中輸入命令:命令僅在執行後執行。 應在設備編程手冊中指定要使用的終結符字符。 似乎CR是確定的,因爲你的MatLab代碼工作。

在您的MatLAb代碼中,您將終結器設置爲CR字符(ASCII代碼13)。我沒有在你的C#代碼中看到這個,所以你的設備等待CR這是不發送的,所以你的設備應該沒有反應。 我不認爲C#會爲你發送終結符,你應該自己照顧它。

我的猜測是,

R.Write(rel+""+ctr + "\r"); 

應該解決的問題(感謝dodald提醒我,我錯過了正確的結論)。請參閱Terminator property of SERIAL objectRules for Writing the Terminator

+0

所以要回答,salman應該能夠在C#代碼的字符串末尾添加'\ r'。 (\ r是CR字符) 例如R.Write(rel +「」+ ctr +「\ r」); – dodald 2014-09-03 21:00:20

+0

似乎喜歡它。至少這是我在MatLab和C#版本之間發現的差異。 – anandr 2014-09-03 21:03:52

+0

或者,他可以簡單地使用WriteLine方法。 – 2014-09-03 21:12:38