2014-09-03 90 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