串口通讯

串口波特率:

部分产品(使用USB转串口芯片):9600bps,1位停止位,无校验
其它产品(使用USB-CDC协议):无波特率限制(无论上位机如何设置,都以USB最大速率传输)

命令行结束符:

CR+LF结尾,对应两个二进制字符0x0D和0x0A,用C语言编程则是\r\n

命令行特殊符号:

Ctrl-C复位:单个二进制字符0x03,用C编程则是\x03
在绝大数情况下,发送这个字符会直接停止当前执行的命令或复位控制台,并打印新的提示符“=>”

调试工具(Linux):

miniterm.py 是pyserial库自带的终端调试脚本,使用pip自动安装
无须特别设置接收/发送行结束符

mcush_util的shell模式,提供了一个迷你的串口交互调试环境


调试工具(Windows):

Tera Term https://ttssh2.osdn.jp/ (若外网无法下载,请自行搜索其它链接)
注意设置接收/发送行结束符,如图:


Ubuntu系统下串口端口和权限:

端口通常会枚举成/dev/ttyUSBxxx或/dev/ttyACMxxx,编号自动递增。
为了避免编号变换,可以按USB设备VID/PID检索:
/dev/serial/by-id/usb-???????????
或者按总线路径检索:
/dev/serial/by-path/pci-???????????
普通用户需要加入dialout组获得权限(修改/etc/group文件)。

Windows命令行发送串口指令:

如echo a -c 0xff00ff > \\.\comXX  (XX为生成的串口编号,到设备管理器中检查)
上述命令会发送“a -c 0xff00ff”到指定串口
可以将命令放进.bat脚本自动化运行。
发送过程并任何无反馈检查,只适合发送简单命令

控制台使用mcush_util工具发送串口指令:

直接在控制台下发送串口指令可能会失败,原因有:
  • 未正确设置波特率
  • 控制台已经缓冲了部分字符,输入的指令被追加在末尾导致命令无效
  • 上个命令耗时较长,尚未结束
  • 正在执行某些交互式命令,当前输入被误认为子指令
    此时可以借用命令行工具mcush_util来处理(支持Win/Linux)。 如:
    $ mcush_util -p /dev/ttyUSB0 run "cat /r/readme"
    VAP200,1.0
    30CA01A034678900
    Vibration Analysis Platform
    8 synchronous channels with external trigger
    sample rate up to 204ksps
    Shanghai Linkong Software Technologies Co., Ltd. 2021
    www.xrsoft.com/vap/ 
    该命令打开指定串口,发送Ctrl-C重置控制台得到提示符,执行*idn?检查,并执行指定的多个命令。
    下载:Win(32bit) mcush_util.exe, Linux(64bit) mcush_util
    其它平台的可自行源码编译(提供CodeBlocks项目,或Makefile/GCC,支持交叉编译)

    LabVIEW使用DLL发送串口指令:

    调用动态链接库mcush_util.dll的mcush_command函数给设备发送命令,只需传入端口号和命令参数字符串即可。



  • C/C++编程

    C语言封装示例 mcush_api.c mcush_api.h
    调用示例
    
    #include < stdio.h >
    #include "mcush_api.h"
    
    int main( int argc, char *argv[] )
    {
        mcush_dev_t dev;
    
        if( mcush_open( &dev, "/dev/ttyUSB0", 9600, 5 ) <= 0 )
        {
            printf("fail to open port\n");
            return 0;
        }
    
        if( mcush_connect( &dev ) <= 0 )
        {
            printf("fail to connect the device\n");
            return 0;
        }
    
        mcush_write_command( &dev, "*idn?" );
        printf( "%s", dev.result );
    
        mcush_write_command( &dev, "cat /r/readme" );
        printf( "%s", dev.result );
    
        mcush_close( &dev );
        return 0;
    }
    
    ===========RESULT (tested in Ubuntu/GCC)==================
    ShellLab-L2,1.0
    35A003129595680400324D4D
    WS2812 LED Strap controller based on Shell Lab
    http://www.xrsoft.com/shell-lab/
    Shanghai Linkong Software Technologies Co., Ltd. 2020
    
    

    C++语言封装示例 mcush_drv.cpp mcush_drv.h mcush_api.c mcush_api.h
    调用示例
    
    #include < stdio.h >
    #include < unistd.h >
    #include "mcush_drv.h"
    
    
    int main( int argc, char *argv[] )
    {
        char buf[512];
        McushDrv *drv;
    
        drv = new McushDrv( "/dev/ttyUSB0", 9600, 5 );
        if( drv->err <= 0 )
        {
            printf( "fail to open port\n" );
            return 0;
        }
    
        if( drv->connect() <= 0 )
        {
            printf( "fail to connect the device\n" );
            return 0;
        }
    
        if( drv->scpiIdn( buf ) )
        {
            printf( "%s", buf );
            drv->scpiRst();
        }
    
        return 0;
    }
    
    
    ===========RESULT (tested in Ubuntu/GCC)==================
    ShellLab-L2,1.0
    35A003129595680400324D4D
    

    Python