笔者在Linux上开发ESP8266 AT指令处理程序时,发现 发送软复位指令“AT+RST”后 ,串口无法再次发送AT指令 给WIFI模块,
开始以为是AM335x 的串口驱动存在问题,接收到ESP-7S 模块的启动乱码后工作异常,复位串口能够恢复所以就没有详细分析,
串口配置信息如下:
int cpu_uart_ioctl(int fd, u32 cmd, void *arg)
{
int ret;
struct termios options;
bzero(&options, sizeof(options));
tcgetattr(fd, &options);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~CSIZE;
options.c_cflag &= ~CRTSCTS; /* 无硬件流控 */
options.c_cflag |= CS8; /* 八位数据位 */
options.c_cflag &= ~CSTOPB; /* 一位停止位 */
options.c_cflag &= ~PARENB; /* 无奇偶校验位 */
options.c_iflag &= ~(ICRNL|INLCR); /* 接收回车换行不变 */
options.c_iflag |= IGNPAR; /* 忽略校验错误字符 */
options.c_oflag &= ~OPOST; /* 原生输出 */
options.c_oflag = 0;
options.c_lflag = 0;
cfsetispeed(&options, B115200); //根据自己的波特率进行相应更改
cfsetospeed(&options, B115200);
ret = tcsetattr(fd, TCSANOW, &options);
return ret;
}
直到,后来应用开发人员在使用该驱动进行透传时发现,运行一段时间后主站发送报文收不到装置的响应,最后排查发现原来是串口收到特殊数据“0x13” 时
开启了软件流控,导致串口无法发送 ,串口接收到“0x11” 会关闭流控可以恢复,所以导致该现象时有时无,排查花了一天的时间,太坑了!!!
解决方法:
在串口配置中增加如下选项:
options.c_iflag &= ~(ICRNL|IGNCR|IXON|IXOFF)
详细分析可参考这篇博文: