用Matlab读取与Arduino连接的串口数据(uint)。1.用fscanf,fgetl,fread哪个更快?2.如何回调函数读取?
现在Arduino每1ms用println传输1个unsignedint到串口。我的matlab程序用的是whileloop不断fscanf读取,以收集特定数量数据。问题...
现在Arduino每1ms用println传输1个unsigned int到串口。我的matlab程序用的是while loop不断fscanf读取,以收集特定数量数据。问题是无法达到1ms的读取速度,我写的arduino测试程序将被传输的int按秒递增,譬如在第2000到2999个数据处看到的数值应该是3;49000到49999个处应该是50。 以此观测1ms数据传输有明显延迟。而我尝试2ms一个int发送,用同样的matlab程序读取就很顺畅,实验传输结果完全没有问题。
可是,我的项目指导认为我做的非常糟糕,提出三个问题
fgetl比fscanf快,应尝试fgetl, 我这个方面一直未找到理论和研究报告做佐证,希望有经验的高人指导
1ms会出现延迟和数据传输问题,但是既然我无法给出是什么问题,2ms可能会有同样的问题,所以我们不能把传输速率降到用2ms(依然足够应付我们的项目) 不知道是不是这样?我这个逻辑有点混乱被说的。
他提出用回调函数读取(每4 byte一个event读取一次),以下是我原来的code,他认为这个比回调函数的效率低
----------------------------------------------------------------------------------------------------
。。。。。初始化程序省略
while x<10000; if arduino.BytesAvailable > 0; x = x + 1; data1 = fscanf(arduino);
end
end
但我也未找到佐证说回调函数读取效率高,并且在重写程序用回调函数时,出现
BytesAvailableFcnMode cannot be set while OBJ is open.的警告
以下是我新的code:
---------------------------------------------------------------------------------------------------
.......初始化程序省略
fopen(arduino);
arduino.BytesAvailableFcnMode = 'byte'; arduino.BytesAvailableFcnCount = 4; arduino.BytesAvailableFcn = @mycallback; --------------------------------------------------------------------------------------------------
function mycallback(obj,event) data1 = fscanf(arduino); temp = str2num(data1); y(x) = temp;end我检索了一下,bytesavailable确实只能在fclose后才能用,但是object.BytesAvailable这个指令可以在fopen时用,那如何用这个指令来用callback/event 读取数据呢?
很长,能详细回答就谢谢啦。
写错了上面 2000到2999个数据处看到的数值应该是2;49000到49999个处应该是49
问题很多,主要的两个问题就是在标题里写了。如果能回答也给采纳 展开
可是,我的项目指导认为我做的非常糟糕,提出三个问题
fgetl比fscanf快,应尝试fgetl, 我这个方面一直未找到理论和研究报告做佐证,希望有经验的高人指导
1ms会出现延迟和数据传输问题,但是既然我无法给出是什么问题,2ms可能会有同样的问题,所以我们不能把传输速率降到用2ms(依然足够应付我们的项目) 不知道是不是这样?我这个逻辑有点混乱被说的。
他提出用回调函数读取(每4 byte一个event读取一次),以下是我原来的code,他认为这个比回调函数的效率低
----------------------------------------------------------------------------------------------------
。。。。。初始化程序省略
while x<10000; if arduino.BytesAvailable > 0; x = x + 1; data1 = fscanf(arduino);
end
end
但我也未找到佐证说回调函数读取效率高,并且在重写程序用回调函数时,出现
BytesAvailableFcnMode cannot be set while OBJ is open.的警告
以下是我新的code:
---------------------------------------------------------------------------------------------------
.......初始化程序省略
fopen(arduino);
arduino.BytesAvailableFcnMode = 'byte'; arduino.BytesAvailableFcnCount = 4; arduino.BytesAvailableFcn = @mycallback; --------------------------------------------------------------------------------------------------
function mycallback(obj,event) data1 = fscanf(arduino); temp = str2num(data1); y(x) = temp;end我检索了一下,bytesavailable确实只能在fclose后才能用,但是object.BytesAvailable这个指令可以在fopen时用,那如何用这个指令来用callback/event 读取数据呢?
很长,能详细回答就谢谢啦。
写错了上面 2000到2999个数据处看到的数值应该是2;49000到49999个处应该是49
问题很多,主要的两个问题就是在标题里写了。如果能回答也给采纳 展开
若以下回答无法解决问题,邀请你更新回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询