FsuOS提供了比较丰富的调试方法用于解决实际工程中的接入问题。
需要注意的是,AI值,有时候是0-5v或者4-20ma的映射值,有时候是实际的电压(53.5V)或者电流输入值(-20.3A),有时是实际的温湿度值(28.3度),这个需要根据实际FSU的外部接口确定。 用户可以查询 https://www.fsuos.com/docs/fsu-supported/ 来确定。
FsuOS网站
用户通过登录FsuOS网站,点击"测试"->“串口测试”,选择一个串口,比如1,点击"连接",下方"请求日志"里显示”连接成功",通讯数据里就会打印选中串口的收发数据。
SMDDevice串口数据打印
由于部分FSU设备上,FsuOS没有实现网站查看串口通讯的功能(比如EISU),个别设备由于网络原因,也会造成网站的串口数据无法查看,此时我们就使用最基本的方式。
用户通过编辑SMDDevice.conf配置文件,打开
log_sp=1 # 打开串口打印
sp_debug=0 # 开串口1的打印,SMDDevice内部是从0开始的
sp_debug=7 # 开串口6的打印
然后启动
./SMDDevice
此时注意看:就会看到CMD_DATA Port 0: 01 03 这种发送信息,还有串口0收到数据:01 03 这种接收信息。
FsuOS的串口程序默认使用的boost的ASIO的异步读写方式,有时候由于底层FSU操作系统驱动实现不标准(gfsu2),造成通信不稳定,卡死,此时我们可以切换串口模式为
select模式+read模式。
用户通过编辑SMDDevice.conf配置文件,打开
sp_sync=0 # 将串口1改为同步读模式
sp_sync=5 # 将串口6改为同步读模式
特别容易出错
int DeviceIoControl(int ioControlCode, const void* inBuffer, int inBufferSize, void* outBuffer, int outBufferSize, int& bytesReturned)
{
switch(ioControlCode) {
case 1: {
ioRet = -1;
OpenPort();
state = ioControlCode;
//do something
break;
}
case WRITE_CURRE
{
break;
}
}
这个执行操作的时候,我们通常会把ioControlCode直接作为状态码。
这时候要小心的是:
state = ioControlCode;
不要写在一开始的地方,因为DeviceIoControl的调用方式,是先发命令,然后重试等待获取结果,比如下发开机命令ioControlCode=50,紧接着就会下发ioControlCode=51问结果,51这个命令不应该修改state,会造成判断结果代码不正常。