佚名通过本文主要向大家介绍了c++串口通信实例,c++串口通信,c++串口,c++串口编程实例,c++串口编程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: C++串口无法接受到完整的数据
描述:
描述:
C++串口
串口程序不能够读出完整的数据,哪位大神帮忙看一下// JoComDDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "JoComD.h"
#include "JoComDDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 定义串口设置参数表格
const CString PorTbl[6] = {_T("COM1:"),_T("COM2:"),_T("COM3:"),_T("COM4:"),_T("COM5:"), _T("COM6:")};
const DWORD BaudTbl[6] = {4800, 9600, 19200, 38400, 57600,115200};
const DWORD DataBitTbl[2] = {7, 8};
const BYTE StopBitTbl[3] = {ONESTOPBIT, ONE5STOPBITS, TWOSTOPBITS};
const BYTE ParityTbl[4] = {NOPARITY, ODDPARITY, EVENPARITY, MARKPARITY};
// CJoComDDlg 对话框
CJoComDDlg::CJoComDDlg(CWnd* pParent /*=NULL*/)
: CDialog(CJoComDDlg::IDD, pParent)
, m_strRecDisp(_T(""))
, m_strSendEdit(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CJoComDDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
// DDX_Control(pDX, IDC_PORT, m_ComboBaud);
DDX_Control(pDX, IDC_PORT, m_ComboPort);
DDX_Control(pDX, IDC_BAUD, m_ComboBaud);
DDX_Control(pDX, IDC_DATA, m_ComboData);
DDX_Control(pDX, IDC_STOP, m_ComboStop);
DDX_Control(pDX, IDC_PARITY, m_ComboParity);
DDX_Text(pDX, IDC_REC_DISP, m_strRecDisp);
DDX_Text(pDX, IDC_SEND_EDIT, m_strSendEdit);
DDX_Control(pDX, IDC_OPEN_COM, m_ButOpen);
DDX_Control(pDX, IDC_CLOSE_COM, m_ButClose);
}
BEGIN_MESSAGE_MAP(CJoComDDlg, CDialog)
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
ON_WM_SIZE()
#endif
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_OPEN_COM, &CJoComDDlg::OnBnClickedOpenCom)
ON_BN_CLICKED(IDC_CLOSE_COM, &CJoComDDlg::OnBnClickedCloseCom)
ON_BN_CLICKED(IDC_SEND, &CJoComDDlg::OnBnClickedSend)
ON_BN_CLICKED(IDC_CLEAR_SEND, &CJoComDDlg::OnBnClickedClearSend)
ON_BN_CLICKED(IDC_CLEAR_REC, &CJoComDDlg::OnBnClickedClearRec)
END_MESSAGE_MAP()
// CJoComDDlg 消息处理程序
BOOL CJoComDDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
CString strItem = L"";
m_ComboPort.ResetContent();
for(int i=0;i<6;i++)
{
strItem.Format(L"COM%d",i+1);
m_ComboPort.AddString(strItem);
}
m_ComboPort.SetCurSel(0);
m_ComboBaud.ResetContent();
m_ComboBaud.AddString(L"4800");
m_ComboBaud.AddString(L"9600");
m_ComboBaud.AddString(L"19200");
m_ComboBaud.AddString(L"38400");
m_ComboBaud.AddString(L"57600");
m_ComboBaud.AddString(L"115200");
m_ComboBaud.SetCurSel(1);
m_ComboParity.ResetContent();
m_ComboParity.AddString(L"无");
m_ComboParity.AddString(L"奇");
m_ComboParity.AddString(L"偶");
m_ComboParity.AddString(L"Mark");
m_ComboParity.AddString(L"Space");
m_ComboParity.SetCurSel(0);
m_ComboData.ResetContent();
m_ComboData.AddString(L"7");
m_ComboData.AddString(L"8");
m_ComboData.SetCurSel(1);
m_ComboStop.ResetContent();
m_ComboStop.AddString(L"1");
m_ComboStop.AddString(L"1.5");
m_ComboStop.AddString(L"2");
m_ComboStop.SetCurSel(0);
m_ButClose.EnableWindow(FALSE); /* "关闭端口"按键无效 */
m_hComm = INVALID_HANDLE_VALUE; /* 串口操作句柄无效 */
m_ExitThreadEvent = NULL; /* 串口接收线程退出事件无效 */
m_strRecDisp = _T(""); /* 接收显示字符为空 */
UpdateData(FALSE); // 更新显示
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
void CJoComDDlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
{
if (AfxIsDRAEnabled())
{
DRA::RelayoutDialog(
AfxGetResourceHandle(),
this->m_hWnd,
DRA::GetDisplayMode() != DRA::Portrait ?
MAKEINTRESOURCE(IDD_JOCOMD_DIALOG_WIDE) :
MAKEINTRESOURCE(IDD_JOCOMD_DIALOG));
}
}
#endif
/*******************************************************************************************
函数名称: CSerialPortDlg::OpenPort
描 述: 打开串口
输入参数: LPCTSTR Port: 串口名,如"COM0:","COM1:"
int BaudRate: 波特率
int DataBits: 数据位, 取值为7或8
int StopBits: 停止位
int Parity : 奇偶校验位
输出参数: 无
返 回: FALSE: 失败; TRUE: 成功
********************************************************************************************/
BOOL CJoComDDlg::OpenPort(LPCTSTR Port, int BaudRate, int DataBits, int StopBits, int Parity)
{
COMMTIMEOUTS CommTimeOuts;
// 打开串口
m_hComm = CreateFile(Port, GENERIC_READ | GENERIC_WRITE, 0, NULL , OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
if(m_hComm == INVALID_HANDLE_VALUE)
{
MessageBox(_T("无法打开端口或端口已打开! 请检查是否已被占用, 例如GPRS占用UART0."));
return FALSE;
}
GetCommState(m_hComm, &dcb); /* 读取串口的DCB */
dcb.BaudRate = BaudRate;
dcb.ByteSize = DataBits;
dcb.Parity = Parity;
dcb.StopBits = StopBits;
dcb.fParity = FALSE; /* 禁止奇偶校验 */
dcb.fBinary = TRUE;
dcb.fDtrControl = 0; /* 禁止流量控制 */
dcb.fRtsControl = 0;
dcb.fOutX = 0;
dcb.fInX = 0;
dcb.fTXContinueOnXoff = 0;
//设置状态参数
SetCommMask(m_hComm, EV_RXCHAR); /* 串口事件:接收到一个字符 */
SetupComm(m_hComm, 16384, 16384); /* 设置接收与发送的缓冲区大小 */
if(!SetCommState(m_hComm, &dcb)) /* 设置串口的DCB */
{
MessageBox(_T("无法按当前参数配置端口,请检查参数!"));
ClosePort();
return FALSE;
}
//设置超时参数
GetCommTimeouts(m_hComm, &CommTimeOuts);
CommTimeOuts.ReadIntervalTimeout = 100; /* 接收字符间最大时间间隔 */
CommTimeOuts.ReadTotalTimeoutMultiplier = 1;
CommTimeOuts.ReadTotalTimeoutConstant = 100; /* 读数据总超时常量 */
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutC