2014-09-03 3 views
-1

Я пытаюсь запустить беговую дорожку с помощью последовательного порта, я смог сделать это с помощью Matlab, но у меня есть несколько проб, когда я портировал один и тот же код на C#. Я уверен, что порт открыт, возможно, что-то не так с форматом сообщений. Было бы здорово, если кто-то может сказать мне, какую ошибку я делаю. Ниже приведен код Matlab (который работает) и код C# (который не работает).C# Передача сообщения через serialport

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# версии кода MatLab выше

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

Есть сообщения об ошибке? Что означает «это не работает»? –

+0

Кроме того, что такое «печать»? Если вы пытаетесь записать в консоль, используйте Console.WriteLine(). –

+0

По крайней мере, добавьте сообщение об ошибке или описание того, что не работает ... – Kris

ответ

0

Я не очень знаком с C#, но я буду пытаться угадать, что вы должны также отправить terminator символ в вашем коде C#.

Проверьте fprintf (serial) документации в MatLab:

fprintf (объект, 'Cmd') записывает строку ЦМД на устройство, подключенное к последовательному порту объекта, OBJ. Формат по умолчанию:% s \ n. Операция записи является синхронной и блокирует командную строку до завершения выполнения.
fprintf (obj, 'format', 'cmd') пишет строку, используя формат, указанный в формате.

В вызовах вы используете 1-синтаксис, ваш вызов

fprintf(R, [rel ctr]); 

фактически

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

Обычно последовательные устройства чтения входных данных до тех пор, терминатор символ не найден. Это означает, что передача командной строки или данных завершена, и теперь устройство может выполнить команду. Это очень похоже на нажатие ENTER в командном окне MatLab: команда выполняется только после этого. Какой символ ограничителя следует указывать в руководстве по программированию устройства. Кажется, что CR в порядке, так как ваш код MatLab работает.

В коде MatLAb вы устанавливаете терминатор как символ CR (код ASCII 13). Я не вижу этого в коде C#, поэтому ваше устройство ждет CR, который не отправляется, поэтому на вашем устройстве не должно быть никакой реакции. Я не думаю, что C# отправит вам символ терминатора, вы должны позаботиться об этом самим.

Я думаю, что

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

должны решить эту проблему (спасибо dodald за напоминание мне, что я пропустил правильный вывод).

См. Также Terminator property of SERIAL object и Rules for Writing the Terminator.

+0

Чтобы ответить, салман должен иметь возможность просто добавить '\ r' в конец строки в коде C#. (\ r - CR char) , например. R.Write (rel + "" + ctr + "\ r"); – dodald

+0

Похоже на это. По крайней мере, это разница, которую я обнаружил между версиями MatLab и C#. – anandr

+0

В качестве альтернативы, он может просто использовать метод WriteLine. –

Смежные вопросы