libctb库的win版本返回指令遇到00被截断问题

简介: 解决libctb for c++ 在win的Read函数处置不严谨导致返回指令被截断问题

libctb库是c++实现串口通信的第三方扩展库,该是直接提供源码的,可取https://www.iftools.com/start/index.en.php网站的download页面搜索libctb下载其源码,例如libctb-0.16.tar.gz。

其具体编译查看其解压目录下的build即可实现,在实践发现中在读取数据是,会出现数据被截断的情况,例如:

0102002160指令,读取返回0102,后面 数据被抛弃,经源码调试发现,其读取数据是正确的,但在计算长度时将00作为结束符,造成计算长度异常,现给出修改参考,给同样遇到该问题的读者

打开libctb-0.16\src\win32\serport.cpp文件,修改

    int SerialPort::Read(char* buf,size_t len)
    {
	   DWORD read;
	   int m = m_fifo->items();
	   while(len) {
		  if(m_fifo->get(buf) == 1) {
			 len--;
			 buf++;
		  }
		  else {
			 break;
		  }
	   }
	   if(!ReadFile(fd,buf,len,&read,&m_ov)) {
		  // if we use a asynchrone reading, ReadFile gives always
		  // FALSE
		  // ERROR_IO_PENDING means ok, other values show an error
		  if(GetLastError() != ERROR_IO_PENDING) {
			 // oops..., error in communication
			 return -1;
		  }
	   }
	   else {
		  // ok, we have read all wanted bytes
		  return (int)read + m;
	   }
	   return 0;
    };
AI 代码解读

    int SerialPort::Read(char* buf,size_t len)
    {
	   DWORD read;
	   int m = m_fifo->items();
	   while(len) {
		  if(m_fifo->get(buf) == 1) {
			 len--;
			 buf++;
		  }
		  else {
			 break;
		  }
	   }
	   //printf("SerialPort::Read(%d,%d)..1..\n", m, len);
	   //byte _buf[64] = { 0 };
	   if(!ReadFile(fd,(LPVOID)buf,len,&read,&m_ov)) {
		  // if we use a asynchrone reading, ReadFile gives always
		  // FALSE
		  // ERROR_IO_PENDING means ok, other values show an error
		  if(GetLastError() != ERROR_IO_PENDING) {
			 // oops..., error in communication
			  //printf("SerialPort::Read error(%d)..2..\n", (int)GetLastError());
			 return -1;
		  }
	   }
	   else {
		   //memcpy(buf, _buf, (int)read + m);
		   //printf("SerialPort::Read(%d,%d,%d,%d)..3..\n", m, len,(int)read,strlen(buf));
		  // ok, we have read all wanted bytes
		  return (int)read + m;
	   }
	   //继续处置后续字符,防止被丢弃
	   int size = strlen(buf);
	   for (int i = size; i < len; i++)
	   {
		   if (0X00 != buf[i])
			   size = i+1;
	   }

	   //memcpy(buf, _buf, (int)read + m);
	   //printf("SerialPort::Read(%d,%d,%d,%d)..4..\n", m, len, (int)read, strlen(buf));
	   return size;
    };
AI 代码解读

完成修改重新编译libctb的调用库, 在调用其Read函数时,可以再加一层保险,就不会出现本文描述的截断情况

char cache[128] = { 0 };
memset(cache, 0x00, 128);
Ret = Read(cache, 128);   // 读应答数据 ascii,结尾字段丢失,明明有数据,却返回长度为0
readlen = (int)strlen(cache);
nrecs = (Ret <  readlen ? readlen : Ret);

if (acssiif)
{
       memcpy(atres, cache, nrecs);
 }
else {
       nrecs = PFunc::bytes2string((const unsigned char*)cache, (char*)atres, nrecs);//ascii to hex
}

目录
打赏
0
0
0
0
2
分享
相关文章
介绍5款 世界范围内比较广的 5款 mysql Database Management Tool
介绍5款 世界范围内比较广的 5款 mysql Database Management Tool
395 0
如何判断当前屏幕TextView是否会自动换行_Android提高篇(Java)
如何判断当前屏幕TextView是否会自动换行_Android提高篇(Java)
580 0
MAC编译jogl/gluegen很顺利
MAC编译jogl/gluegen很顺利
83 0
【Java 网络编程】TCP 服务器端 客户端 简单示例(一)
【Java 网络编程】TCP 服务器端 客户端 简单示例(一)
327 0
【Java 网络编程】TCP 服务器端 客户端 简单示例(一)
第29节:线程简介和MySQL调试环境搭建
最后我想简单说一下我的MySQL调试环境的搭建,但是在此之前不得不简单说一下什么是线程,因为如果不解释一下什么是线程,简单的调试可能都会有阻碍,同时了解线程对我们普通DBA诊断性能问题也有极大的帮助。
894 0
kde
|
16天前
|
Docker镜像加速指南:手把手教你配置国内镜像源
配置国内镜像源可大幅提升 Docker 拉取速度,解决访问 Docker Hub 缓慢问题。本文详解 Linux、Docker Desktop 配置方法,并提供测速对比与常见问题解答,附最新可用镜像源列表,助力高效开发部署。
kde
9765 77
|
13天前
typora免费版,激活方法,Typora使用教程
Typora是一款简洁高效的Markdown编辑器,支持即时渲染。本教程涵盖安装方法、文件操作、视图控制、格式排版、字体样式及Markdown语法,助你快速上手使用Typora进行高效写作。
2466 6
Windows安装Claude Code
Claude Code 是 Anthropic 推出的代码助手,支持在 Windows 通过 WSL(Windows Subsystem for Linux)运行。本文介绍如何在 Windows 系统中启用 WSL、安装 Ubuntu 子系统、配置 Python 与 Node.js 环境,并最终安装和运行 Claude Code。内容涵盖 WSL 设置、开发工具安装、依赖配置及常见问题解决方法,助你顺利在本地环境中使用 Claude Code 提升编码效率。
655 1
Windows安装Claude Code

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问