本人的课题是基于VC串口通信的温控系统,如何才能很好的实现VC串口与PC机和传感器以及其他串口之间的通信呢
解决方案 »
- 关于多线程同步中的对象有无信号状态的问题
- 想找个vc的老师
- 如何让vb中看到的控件属性可以选择文件?
- 如何在CFormView销毁之前弹出对话框?
- ms h.263压缩视频ICSendMessage(m_hIC,0x60c9,0xf7329ace,0xacdeaea2)只能是176*144大小,有谁知道改变大小的方法???
- 求大神帮忙,解决picture控件重绘问题
- 如何通知一个正在Sleep(INFINITE)的线程结束运行?
- 请教一个很菜很菜的问题!
- 怎样在桌面右下角的托盘里显示256色的图标?
- 聊天程序,怎么实现不同字体,颜色以及大小的?
- 难道是数组初始化问题?
- 问个关于图片移动(动画)的问题?
#pragma once
#include <Windows.h>
#include "Defines.h"
#include "DbConnection.h"
#include "Comm.h"
#include "stdafx.h"
class Comm
{
private: HANDLE m_hComm;// 串口设备句柄 public: Comm(void);
public:
~Comm(void); public:
BOOL OpenComm(wchar_t* pPort, int nBaudRate, int nParity, int nByteSize, int nStopBits);
BOOL CloseComm();
int ReadComm(void* pData, int nLength);
int WriteComm(void* pData, int nLength);
};
#include "StdAfx.h"
#include "Comm.h"Comm::Comm()
{
m_hComm=NULL;
}Comm::~Comm()
{
m_hComm=NULL;
}// 打开串口
// 输入: pPort - 串口名称或设备路径,可用"COM1"或"\\.\COM1"两种方式,建议用后者
// nBaudRate - 波特率
// nParity - 奇偶校验
// nByteSize - 数据字节宽度
// nStopBits - 停止位
BOOL Comm::OpenComm(wchar_t * pPort, int nBaudRate, int nParity, int nByteSize, int nStopBits)
{
DCB dcb; // 串口控制块
COMMTIMEOUTS timeouts = { // 串口超时控制参数
100, // 读字符间隔超时时间: 100 ms
1, // 读操作时每字符的时间: 1 ms (n个字符总共为n ms)
500, // 基本的(额外的)读超时时间: 500 ms
1, // 写操作时每字符的时间: 1 ms (n个字符总共为n ms)
100}; // 基本的(额外的)写超时时间: 100 ms m_hComm = CreateFile(pPort, // 串口名称或设备路径
GENERIC_READ | GENERIC_WRITE, // 读写方式
0, // 共享方式:独占
NULL, // 默认的安全描述符
OPEN_EXISTING, // 创建方式
0, // 不需设置文件属性
NULL); // 不需参照模板文件 if(m_hComm == INVALID_HANDLE_VALUE) return FALSE; // 打开串口失败 GetCommState(m_hComm, &dcb); // 取DCB dcb.BaudRate = nBaudRate;
dcb.ByteSize = nByteSize;
dcb.Parity = nParity;
dcb.StopBits = nStopBits; SetCommState(m_hComm, &dcb); // 设置DCB SetupComm(m_hComm, 4096, 1024); // 设置输入输出缓冲区大小 SetCommTimeouts(m_hComm, &timeouts); // 设置超时 return TRUE;
}// 关闭串口
BOOL Comm::CloseComm()
{
return CloseHandle(m_hComm);
}// 写串口
// 输入: pData - 待写的数据缓冲区指针
// nLength - 待写的数据长度
// 返回: 实际写入的数据长度
int Comm::WriteComm(void* pData, int nLength)
{
DWORD dwNumWrite; // 串口发出的数据长度 WriteFile(m_hComm, pData, (DWORD)nLength, &dwNumWrite, NULL); return (int)dwNumWrite;
}// 读串口
// 输入: pData - 待读的数据缓冲区指针
// nLength - 待读的最大数据长度
// 返回: 实际读出的数据长度
int Comm::ReadComm(void* pData, int nLength)
{
DWORD dwNumRead; // 串口收到的数据长度 ReadFile(m_hComm, pData, (DWORD)nLength, &dwNumRead, NULL); return (int)dwNumRead;
}