PComm引起的内存占用过多

在一次使用PComm中,发现CPU占用超过50%,当没有接收数据时,%1~2%左右,而接收数据时在40%~60%之间,但数据量很少呀,难道是我的接收线程的问题,我是用一个线程一直读数据,如果读取的长度小于1,重新读,一般来讲,这肯定会引起CPU一直忙不停的读,但以前并没有出现这样的情况呀,也是这样写的,忽然想起了串口有个读超时的设置,难道是读超时为0,所以CPU一直在读,结果加了超时设置后:sio_SetReadTimeouts(1,2000,40),就正常了,说明我的判断是正确的。初学的朋友一定要记得如果是使用PComm通信的话,一定要设置超时。

int WINAPI sio_ioctl(int port, int baud, int mode); int WINAPI sio_getch(int port); int WINAPI sio_read(int port, char *buf, int len); int WINAPI sio_putch(int port, int term); int WINAPI sio_write(int port, char *buf, int len); int WINAPI sio_flush(int port, int func); long WINAPI sio_iqueue(int port); long WINAPI sio_oqueue(int port); int WINAPI sio_lstatus(int port); int WINAPI sio_lctrl(int port, int mode); int WINAPI sio_cnt_irq(int port, VOID (CALLBACK *func)(int port), int count); int WINAPI sio_modem_irq(int port, VOID (CALLBACK *func)(int port)); int WINAPI sio_break_irq(int port, VOID (CALLBACK *func)(int port)); int WINAPI sio_Tx_empty_irq(int port, VOID (CALLBACK *func)(int port)); int WINAPI sio_break(int port, int time); int WINAPI sio_flowctrl(int port, int mode); int WINAPI sio_Tx_hold(int port); int WINAPI sio_close(int port); int WINAPI sio_open(int port); long WINAPI sio_getbaud(int port); int WINAPI sio_getmode(int port); int WINAPI sio_getflow(int port); int WINAPI sio_DTR(int port, int mode); int WINAPI sio_RTS(int port, int mode); int WINAPI sio_baud(int port, long speed); int WINAPI sio_data_status(int port); int WINAPI sio_term_irq(int port, VOID (CALLBACK *func)(int port), char code); int WINAPI sio_linput(int port, char *buf, int lne, int term); int WINAPI sio_putb_x(int port, char *buf, int len, int tick); int WINAPI sio_putb_x_ex(int port, char *buf, int len, int tms); int WINAPI sio_view(int port, char *buf, int len); int WINAPI sio_TxLowWater(int port, int size); int WINAPI sio_AbortWrite(int port); int WINAPI sio_SetWriteTimeouts(int port, DWORD TotalTimeouts); int WINAPI sio_GetWriteTimeouts(int port, DWORD *TotalTimeouts); int WINAPI sio_SetReadTimeouts(int port, DWORD TotalTimeouts, DWORD IntervalTimeouts);Pcomm串口动态链接库
Moxa是一家做了几十年工业串口卡、串口服务器之类设备的公司,PComm Lite是一套易用性、可靠性久经考验串口编程开发包。相比用API或mscomm控件开发简单太多了。 版本:目前最新版是Version 1.6 Released May 14, 2012 支持XP/win7, 32/64bit的库都有,开发环境支持VC/VB/Delphi。注意可以会搜到另外一个Version 2.6. Released Jul 8, 2008,那是在WIN9x/NT4用的,不要看版本号高下错了。 使用方法:运行安装后有类库、例程、帮助和几个小工具。关键的有四个文件:pcomm.h/pcomm.lib两个文件复制到项目目录并引用,pcomm.dll丢到windows\system32下或跟应用程序放在一起,pcomm.chm帮助备查。 函数介绍:整个库包含50多个函数,最常用的也就10来个: 打开、关闭、设波特率的:sio_open ()、sio_close()、sio_baut() 发送数据的:sio_putch(),sio_write() 接收数据的:sio_getch(),sio_read() 查询输入输出缓冲区状态的:sio_iqueue(), sio_oqueue() 有时可能要设写超时:sio_SetReadTimeouts(), sio_SetWriteTimeouts() 这些函数见名知义,用法查一下PComm.chm就行了。 编程方法: 接收数据一般免不了要开线程的,在接收线程里sio_iqueue()看一下有没有数据,有就处理,没就Sleep()一会。接收数据时它至少会帮你缓冲几十k,一般也不会丢数据。也可以用sio_term_irq()指定接收一定长数据数据就调用一个CALLBACK函数。 这些基本就齐活了。需要控制DTS/RTS、自动流控制都有,甚至还有Xmoderm/Ymoderm/Zmoderm发送文件。如果要Modbus之类的协议就要自己写了。 与其它串口开发方式比较:简单地说API是基础零件,自己做起来麻烦。MSComm控件、CSerialPort类是实验室产品,Pcomm lite是工业成熟产品。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值