搜索
bottom↓
回复: 4

找回ID(2):串口转TCP/IP 实用程序

[复制链接]

出0入0汤圆

发表于 2012-3-26 17:15:55 | 显示全部楼层 |阅读模式
本帖最后由 lningbd 于 2012-3-26 17:16 编辑


关键字:SerialPort 转 TCP/IP、串口编成、远程串口调试

  我正是从VCKBASE 开始学习VC++ 的,没有他我进步不会如此迅速,一直想给VCKBASE贡献点什么,正好今天有空,就把早些时候写的一个串口转TCP/IP的程序发上来,希望对初学者学习串口编程有点帮助。

程序的最大缺陷:
  Windows把硬件驱动的接口都进行了抽象和标准化,串口也不例外,大部分的设备都可以通过文件操作API进行存储控制,如:CreateFile、ReadFile、WriteFile等,其实很简单。网上有个SerialPort的类写得还不错,我就直接拿来用了,只做了小小的修改以满足我的要求。原本的类一次只能收发一个Byte,根据需要我改成了512 Byte,需要重点提出的是,当收发多字节数据时,数据的正确性和完整性更需要自己保证,因为串口协议标准只是定义在物理层和数据链路层,打个比方说,如果一次发送512 Byte,收到不一定是正确的512 Byte,所以自己要进行相关校验保证正确性,也可能不是一次就会完整的收到512 Byte,而是分多次收完所有数据,这时就要我们定义相关结构保证数据收发完整性。这些细节都是跟串口驱动的实现有关,读者感兴趣的话,可以查看相关文档。在这个应用程序中完全没有对这个问题进行防护处理,鉴于一次收发数据量小(512 Byte),并且只是自己的试验品,所以写得并不严谨,把数据收发理想为一次性正确收发,希望各位都能注意了。

程序的整体结构:
程序功能实现如下:
客户端<————> (CTcpSocket)转接程序(CSerialPort) <————>串口设备

对于每个CTcpSocket和CSerialPort对用一个CItem的结构进行管理,可以在配置文件里配置多个连接转发对。
程序中主要的类有:CSerialPort、CTcpSocket、CItem。可以把从串口收到的数据转发向数据套接字和调试套接字,而且可以写入日志文档。


图一 程序显示条目

日志文档结构:
[时间 数据传输方向 数据尺寸] 16 Byte 16进制显示数据 [字符显示]


图二 日志结构

程序配置文件(config.ini)说明:
[item1] #连接名称
TcpDataPort=9990 #数据端口
TcpDebugPort=9991 #调试端口
SerialPort=1 #串口号
Baud=9600 #串口波特率
LogFile=item1.txt #日志名称
LogOn=On #日志开关
Enabled=0 #连接开关

重要数据结构说明:

class CItem
{
public:
        CItem(void);
        ~CItem(void);
public:
        CTcpSocket m_sockDateListen;        //数据监听套接字
        CTcpSocket m_sockDateMain;                //数据套接字
        CTcpSocket m_sockDebugListen;        //调试监听套接字
        CTcpSocket m_sockDebugMain;                //调试套接字
        CTcpSocket m_sockTemp;                //临时 socket
        BOOL m_dataSockInUse;                //相关标志
        BOOL m_debugSockInUse;
        CSerialPort m_serialPort;
        int m_iTotalSendDate;                //收发数据统计
        int m_iTotalRecvDate;
        int m_iDebugPort;                        //调试端口,用来连接额外调试程序,输出数据进行调试
        int m_iDataPort;                        //数据端口
        int m_iSerialPort;                        //串口号
        int m_iBaud;                        //串口波特率
        CString m_strDataLinkTo;                //数据远端IP
        CString m_strDebugLinkTo;                //调试远端IP
        CString m_strItemName;                //转发连接名称
        CString m_mistake;                        //错误信息
        CString m_strLogFileName;                //日志文件
        BOOL m_logFlag;                        //日志文件打开标志
        CSerialTcpDlg* m_pParent;                       
        void SetParentItem();
};

串口消息响应在主对话框中:
LRESULT OnCommunication(WPARAM ch, LPARAM port) //当串口收到数据会调用此程序
结束语

  最初写完这个小程序是为了远程调试串口设备,新手编程习惯极为不好,代码里基本就没有注释,所以现在程序里重要结构和函数的注释都是我后期加的,由于时隔太久,注释不太明晰,读者还要自己多斟酌。风格很烂,此文仅仅是串口编成一个比较实用的例子,不能为生产所用。虽然名义上是用C++写得,但完全是C的风格,而且代码很浅显,高手看看笑过就算了。如有任何问题可与我联系。

代码在VC++ 2005调试通过
工程源代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-3-30 19:52:56 | 显示全部楼层
学习一下~~~~~~~~

出0入0汤圆

发表于 2012-3-30 20:02:25 | 显示全部楼层
帮楼主顶一下

出0入0汤圆

发表于 2012-3-30 20:04:04 | 显示全部楼层
这个资料要顶 最近正好在研究socket

出0入0汤圆

发表于 2012-4-2 16:48:49 | 显示全部楼层
学习学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 18:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表