MATLAB与Arduino串口通信,fwrite函数不行。适用于fprintf

时间:2016-09-16 02:32:56

标签: matlab serial-port

我正在尝试使用串行端口控制基于Arduino微控制器的机器人。机器人使用以下代码完美运行:

clear;
clc;
s=serial ('COM19');
set(s,'BaudRate',115200);
fopen(s);
fprintf(s,'%d',0);
fprintf(s,'%c',13);
fprintf(s,'%d',256);
fprintf(s,'%c',13);
fprintf(s,'%d',512);
fprintf(s,'%c',13);
fprintf(s,'%d',1000);
fprintf(s,'%c',13);
fclose(s);
delete(s);

然而,当我尝试使用fread时,%d等效语句不起作用。然而,使用fwrite(s,13,' uchar')代替fprintf(s,'%c',13)可以正常工作。我不知道用%替换%d的数据类型(我试过' int')以及问题是什么。如果有人有任何建议,那将会有很大的帮助。谢谢

1 个答案:

答案 0 :(得分:0)

Matlab文档中解释了该主题:
http://www.mathworks.com/help/matlab/matlab_external/writing-and-reading-data.html

  

fprintf - 将文字写入设备
  fwrite - 将二进制数据写入设备

它还说:

  

默认情况下,fprintf使用%s \ n格式写入数据...   请注意,ValuesSent属性值包括终结符,因为发送到设备的命令中每次出现的\ n都将替换为Terminator属性值。

根据上面的文档,使用fprintf命令将\n添加到传输文本的末尾。 uint8格式的\n等于10.

二进制和文本数据之间差异的示例:
fwrite(s, 'A', 'uchar')发送值为65的单字节(ASCII值为' A') fprintf(s, "%c", 'A')发送两个字节:65 10(10是终结符) fprintf(s,'%d',100);发送字节:49 48 48 10(49是' 1'的ASCII值)。
fwrite(s, 100, 'uchar');发送一个字节等于:100

如果您使用Serial.read()读取Arduino软件中的单个字节,Arduino需要二进制数据格式。
您可以在Matlab中使用fwrite命令来传输二进制数据 使用fwrite发送大于255的整数值(例如以uint16格式发送两个字节)需要Arduino方面的一些额外工作,Arduino软件需要接收两个字节,并将它们视为单个{ {1}}元素。

如果您更喜欢使用文本数据(在Matlab中使用uint16),您应该将Arduino软件修改为读取文本(ASCII)格式。
请参阅:https://www.arduino.cc/en/Tutorial/ReadASCIIString