- % --- Executes on button press in pb_OpenSerialPort.
- function pb_OpenSerialPort_Callback(hObject, eventdata, handles)
- % hObject handle to pb_OpenSerialPort (see GCBO)
- % eventdata reserved - to be defined in a future version of MATLAB
- % handles structure with handles and user data (see GUIDATA)
- %
- global o_SerialPort;
- %______________________________________________
- %GUI全局变量
- %---------------------串口初始化-----------------------
- %%%COM端口初始化
- int_Index_COM=get(handles.pop_SerialPort,'Value');
- string_COM=get(handles.pop_SerialPort,'String');
- string_Select_COM=string_COM{int_Index_COM};
- o_SerialPort=serial(string_Select_COM);
- %%%Baud初始化
- int_Index_Baud=get(handles.pop_BaudRate,'Value');
- string_Baud=get(handles.pop_BaudRate,'String');
- string_Select_Baud=string_Baud{int_Index_Baud};
- double_Baud=str2double(string_Select_Baud);
- set(o_SerialPort,'BaudRate',double_Baud);
- %%%设置数据长度
- int_Index_DataBit=get(handles.pop_DataBit,'Value');
- string_DataBit=get(handles.pop_DataBit,'String');
- string_Select_DataBit=string_DataBit(int_Index_DataBit);
- double_DataBit=str2double(string_Select_DataBit);
- set(o_SerialPort,'DataBits',double_DataBit);
- %%%设置停止位长度
- int_Index_StopBits=get(handles.pop_StopBits,'Value');
- string_StopBits=get(handles.pop_StopBits,'String');
- string_Select_StopBits=string_StopBits(int_Index_StopBits);
- double_StopBits=str2double(string_Select_StopBits);
- set(o_SerialPort,'StopBits',double_StopBits);
- %%%设置输入缓冲区大小为1M
- set(o_SerialPort,'InputBufferSize',1024000);
- %%%串口事件回调设置
-
- set(o_SerialPort,'BytesAvailableFcnMode','terminator');
- set(o_SerialPort,'terminator','!'); %!标识结束符结束,方便处理和读取数据
- o_SerialPort.BytesAvailableFcn={@EveBytesAvailableFcn,handles};
- % ----------------------打开串口-----------------------
- fopen(o_SerialPort);
matlab串口我们采用回调函数,类似于中断方式哈,但是mtalb的串口十分的不好用哈,没有多线程,而我们在中断里面需要进行波形显示,四元素旋转等各种数据操作,是需要花费点时间的,这就导致我们的数据平率不能很高。。当上传的速率达到100hz以后,就会出错了。。50hz也不稳定。。这个实在是有点。。。担心以后的系统辨识和惯性导航的数据处理了。。头疼。。。
matlab采用符号‘!’为结束符,碰到这个符号matlab就会调用回调函数,中间的数据都是逗号隔开的,数据顺序一次为accex,accey,accez,temp,gyrox,gyroy,gyroz,cpu_major,q0,q1,q2,q3发送,数据通过sprintf进行格式化,然后通过rt_kprintf函数发送,
1 sprintf(buffer,"\n%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7d,%7.2f,%7.2f,%7.2f,%7.2f!", \2 mpu6050_data_tf->acce_x,mpu6050_data_tf->acce_y,mpu6050_data_tf->acce_z,\
3 mpu6050_data_tf->temp,mpu6050_data_tf->gyro_x,mpu6050_data_tf->gyro_y,\
4 mpu6050_data_tf->gyro_z,(s8)cpu_major,q0,q1,q2,q3);
5 rt_kprintf("%s",buffer);