FsuOS调试相关

FsuOS提供了比较丰富的调试方法用于解决实际工程中的接入问题。

FsuOS适配层调试

  • FsuOS网站
    用户通过登录FsuOS网站,点击"设置"->“实时数据查看”,可以看到当前采集器AI,DI,DO通道值。
  • SMDDevice开调试
    用户通过编辑SMDDevice.conf配置文件,打开
    log_fial=1
    或者启动SMDDevice时传递参数
    ./SMDDevice –log_fial=1
    此时主要看打印,就会打印采集的DI,AI值

需要注意的是,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改为同步读模式

DeviceIoControl 函数的状态问题

特别容易出错

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,会造成判断结果代码不正常。