我正在尝试使用Linux Mint 15上的Arduino和C实现一个简单的SLAM项目。 Arduino项目通过蓝牙(串行)向笔记本发送数据。数据由C程序读取。在Arduino串口中,数据显示正确,但在笔记本中,接收的数据是错误的。 (在图像中,白色是Arduino数据。终端显示“已接收”数据。)
我发送d080x096y099z035
(例如)并收到99z0356y0999z035
(乱序?)。
所以,我有一些问题:
如何在C中制作read()
命令,以正确的顺序和长度读取数据? (订单:d000x000y000z000
,长度= 16)
在Arduino发送功能中,使用Serial.print(char buffer[])
和Serial.println(char buffer[])
是否存在长度差异? (比如在缓冲区末尾添加'\n'
或其他东西?)
我应该在Arduino代码或C代码中使用delay()
函数吗?
在Arduino:
...
int buffer_size = 17;
char buffer[17];
//void setup()
void loop(){
//create the string resp = "d000x111y222z333"
...
resp.toCharArray(buffer, buffersize);
bluetooth.print(buffer);
delay(200);
}
在C程序中:
...
int fd = open("/dev/rfcomm4", O_RDONLY | O_NOCTTY | O_NDELAY);
printf("fd code %d\n", fd);
if (fd == -1)
{
gchar *msg = "open_port: Unable to open /dev/rfcomm4";
gtk_label_set_text(GTK_LABEL(label), msg);
perror("error: ");
}
char buffer[17];
int n;
printf("entering in loop...\n");
while (1)
{
n = read(fd, buffer, sizeof(buffer));
printf("%s\n", buffer);
}
答案 0 :(得分:0)
对不起,我不是专家,只是一些想法,你可以检查一下你的问题:
到1)我猜这可能是编码问题,因为Python AFAIK期望文件是unicode。因此,请尝试open (.... ,encoding='ascii')
或您使用的任何编码
还请注意您可能会阻止GTK主线程,这会导致UI出现严重延迟。因此,如果您发送更新请求,我建议创建一个自己的线程来读取串口并填充一个内部缓冲区,该缓冲区由GTK mainthread呈现: http://www.pardon-sleeuwaegen.be/antoon/python/page0.html