之前在本板块发过一个关于CSerialPort 求助,最近有坛友询问关于这方面的问题。
也是为了给更多人提供帮助,把我目前调试过的东西跟大家分享一下。
PS,我也是个上位机菜鸟,希望大家多给建议。 http://blog.sina.com.cn/s/blog_6ca5ea9f0101fdv1.html,我是参照这个里面的内容写的。内容很详细,我就不再赘述了。
其中要注意:
1.将OnComm()函数中的
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
改为 safearray_inp.Attach(variant_inp);
如果不改的话,会有内存泄露。
2.在一次接收事件结束后,要清缓存。
调用 m_MSComm.put_InBufferCount(0);
如果需要自动寻找串口号,可添加下面2个函数,也是网上别人写的,我稍微改了一下,自己测过可以用。
[C++] 纯文本查看 复制代码
int m_nComArray[20];/////查询注册表的串口号,将值存于数组中///本代码参考于mingojiang的获取串口逻辑名代码//void CxDlg::QueryKey(HKEY hKey) { #define MAX_KEY_LENGTH 255#define MAX_VALUE_NAME 16383//TCHAR achKey[MAX_KEY_LENGTH]; // buffer for subkey name//DWORD cbName; // size of name string TCHAR achClass[MAX_PATH] = TEXT(""); // buffer for class name DWORD cchClassName = MAX_PATH; // size of class string DWORD cSubKeys=0; // number of subkeys DWORD cbMaxSubKey; // longest subkey size DWORD cchMaxClass; // longest class string DWORD cValues; // number of values for key DWORD cchMaxValue; // longest value name DWORD cbMaxValueData; // longest value data DWORD cbSecurityDescriptor; // size of security descriptor FILEtiME ftLastWriteTime; // last write time DWORD i, retCode; TCHAR achValue[MAX_VALUE_NAME]; DWORD cchValue = MAX_VALUE_NAME; // Get the class name and the value count. retCode = RegQueryInfoKey(hKey, // key handle achClass, // buffer for class name &cchClassName, // size of class string NULL, // reserved &cSubKeys, // number of subkeys &cbMaxSubKey, // longest subkey size &cchMaxClass, // longest class string &cValues, // number of values for this key &cchMaxValue, // longest value name &cbMaxValueData, // longest value data &cbSecurityDescriptor, // security descriptor &ftLastWriteTime); // last write time for (i=0;i<20;i++)///存放串口号的数组初始化{m_nComArray = -1;}// Enumerate the key values. if (cValues > 0) {for (i=0, retCode=ERROR_SUCCESS; i