我正在尝试使用串行端口控制基于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')以及问题是什么。如果有人有任何建议,那将会有很大的帮助。谢谢
答案 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