我正在尝试使用串口运行跑步机,我能够使用matlab进行操作,但是当我将相同的代码移植到C#时,我遇到了一些问题。我确信端口是打开的,消息格式可能有问题。如果有人能告诉我我犯了什么错误会很棒。下面给出了matlab代码(有效)和C#代码(不起作用)。
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]);
上面的matlab代码的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 :(得分:0)
我对C#并不熟悉,但我会猜测你还应该在C#代码中发送终结者字符。
检查MatLab中的fprintf (serial)文档:
fprintf(obj,'cmd')将字符串cmd写入连接到串行端口对象obj的设备。默认格式为%s \ n。写操作是同步的,并阻止命令行直到执行完成 fprintf(obj,'format','cmd')使用格式指定的格式写入字符串。
在您的通话中,您使用的是第一种语法,因此您的通话
fprintf(R, [rel ctr]);
实际上是
fprintf(R, '%s\n', [rel ctr]);
通常,串行设备读取输入数据,直到找到终结符。这意味着完成了命令字符串或数据的传输,现在设备可以执行该命令。这很像在MatLab命令窗口中按ENTER键:只有在执行此操作后才执行命令。
应在设备编程手册中指定要使用的终结器字符。
似乎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。