69,382
社区成员
发帖
与我相关
我的任务
分享
// 临界区结构对象
CRITICAL_SECTION g_cs;
CString sPort1;
COMMTIMEOUTS TimeOuts1; //串口设置超时结构体
sPort1=ComName1[m_seriport1.GetCurSel()]; //获得所选串口号
CString sPort2;
COMMTIMEOUTS TimeOuts2; //串口设置超时结构体
sPort2=ComName1[m_seriport2.GetCurSel()]; //获得所选串口号
//打开一个串口设备
h_com1=CreateFile(sPort1, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
NULL); // 重叠方式
//打开第二个串口设备
h_com2=CreateFile(sPort2, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
NULL); // 重叠方式
if(h_com1==INVALID_HANDLE_VALUE)
{
MessageBox(L"不能打开这个串口");
return;
}
if(h_com2==INVALID_HANDLE_VALUE)
{
MessageBox(L"不能打开这个串口");
return;
}
SetupComm(h_com1,10240,102400); //1.设置输入输出缓冲
SetupComm(h_com2,10240,102400); //1.设置输入输出缓冲
//4.配置串口
if(!ConfigConnect1())
{
MessageBox(L"配置串口的时候失败");
return;
}
if(!ConfigConnect2())
{
MessageBox(L"配置串口的时候失败");
return;
}
hWnd= GetSafeHwnd();
DWORD dwParam1;
DWORD dwParam2;
if(!SetCommMask(h_com1, EV_RXCHAR | EV_TXEMPTY)) //设置允许的事件类型
{
AfxMessageBox(L"建立事件掩码失败!");
}
if(!SetCommMask(h_com2, EV_RXCHAR | EV_TXEMPTY)) //设置允许的事件类型
{
AfxMessageBox(L"建立事件掩码失败!");
}
// 初始化临界区
InitializeCriticalSection(&g_cs);
hThreadEvent1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProcEvent1,&dwParam1,0,&dwThreadID1);
if(hThreadEvent1 == INVALID_HANDLE_VALUE)
{
AfxMessageBox(L"事件线程1创建失败!");
}
hEventRun1 = true;
hThreadEvent2 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProcEvent2,&dwParam2,0,&dwThreadID2);
if(hThreadEvent2 == INVALID_HANDLE_VALUE)
{
AfxMessageBox(L"事件线程2创建失败!");
}
hEventRun2 = true;
DWORD ThreadProcEvent1(LPVOID pParam)
{
// 进入临界区
EnterCriticalSection(&g_cs);
DWORD dwEvtMask1,dwRes1;
Eol1.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
while(hEventRun1)
{
WaitCommEvent(h_com1, //监视串口事件
&dwEvtMask1, //存放事件掩码组合值
&Eol1); //OVERLAPPED结构
dwRes1 = WaitForSingleObject(Eol1.hEvent, //等待事件的对象句柄
100); //超时事件(ms)
switch(dwRes1)
{
case WAIT_OBJECT_0: //成功得到事件监视结果
switch(dwEvtMask1)
{
case EV_RXCHAR: // 接收到数据
if(!fStopMsg1)
{
fStopMsg1=true;
//向主线程发送消息,接收到数据
::PostMessageW(hWnd, //目的窗口句柄
WM_MYMSG1, //消息名称
0, //传递参数1
(LPARAM)EV_RXCHAR); //传递参数2
}
break;
case EV_TXEMPTY: //发送缓冲区已经清空
AfxMessageBox(L"send buffer1 is empty");
//可以加入发送缓冲区空的处理代码,或向主线程发送消息
break;
}
break;
}
}
// 离开临界区
LeaveCriticalSection(&g_cs);
return true;
}
DWORD ThreadProcEvent2(LPVOID pParam)
{
// 进入临界区
EnterCriticalSection(&g_cs);
DWORD dwEvtMask2,dwRes2;
Eol2.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
while(hEventRun2)
{
WaitCommEvent(h_com2, //监视串口事件
&dwEvtMask2, //存放事件掩码组合值
&Eol2); //OVERLAPPED结构
dwRes2 = WaitForSingleObject(Eol2.hEvent, //等待事件的对象句柄
100); //超时事件(ms)
switch(dwRes2)
{
case WAIT_OBJECT_0: //成功得到事件监视结果
switch(dwEvtMask2)
{
case EV_RXCHAR: // 接收到数据
if(!fStopMsg2)
{
fStopMsg2=true;
//向主线程发送消息,接收到数据
::PostMessageW(hWnd, //目的窗口句柄
WM_MYMSG2, //消息名称
0, //传递参数1
(LPARAM)EV_RXCHAR); //传递参数2
}
break;
case EV_TXEMPTY: //发送缓冲区已经清空
AfxMessageBox(L"send buffer2 is empty");
//可以加入发送缓冲区空的处理代码,或向主线程发送消息
break;
}
break;
}
}
// 离开临界区
LeaveCriticalSection(&g_cs);
return true;
}
unsigned char command43_1Hz[28]={0x0D,0x0A,0x4C,0x4F,0x47,0x20,0x52,0x41,0x4E,0x47,0x45,0x42,0x20,0x4F,0x4E,0x54,0x49,0x4D,0x45,0x20,0x35,0x0D,0x0A};/*23--10hz*/ //LOG RANGEB ONTIME 1 //B代表返回的值是2进制,ONTIME 10 代表0.1HZ
unsigned char CommandBestxyzb_1Hz[25]={0x0D,0x0A,0x4C,0x4F,0x47,0x20,0x42,0x45,0x53,0x54,0x58,0x59,0x5A,0x42,0x20,0x4F,0x4E,0x54,0x49,0x4D,0x45,0x20,0x35,0x0D,0x0A};//LOG BESTXYZB ONTIME 1
WolBestxyz1.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); //创建Wol.hEvent事件句柄,病设置为无信号状态
WriteFile(h_com1,&CommandBestxyzb_1Hz,25,NULL,&WolBestxyz1);
WolBestxyz2.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); //创建Wol.hEvent事件句柄,病设置为无信号状态
WriteFile(h_com2,&CommandBestxyzb_1Hz,25,NULL,&WolBestxyz2);
WolRange1.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); //创建Wol.hEvent事件句柄,病设置为无信号状态
WriteFile(h_com1,&command43_1Hz,28,NULL,&WolRange1);
WolRange2.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); //创建Wol.hEvent事件句柄,病设置为无信号状态
WriteFile(h_com2,&command43_1Hz,28,NULL,&WolRange2);
DWORD dwRes1;
DWORD dwRead1;
DWORD dwErrors1;
COMSTAT Rcs1;
fStopMsg1= true;
ClearCommError(h_com1,&dwErrors1,&Rcs1); //分别存放串口句柄,错误信息的掩码组合,COMSTAT类型的结构体变量,存放设备的当前信息,该函数清除当前通信设备的错误状态,病可以得到当前通信设备的有关信息,通信信息存放在COMSTAT结构体变量中
if(ReadFile(h_com1,&revBuf1,Rcs1.cbInQue,NULL,&Rol1)) //当前串口输入缓冲区中的字节书 //Rcs1.cbInQue为当前串口输入缓冲区的字节数
{
LOOPrev1: iLen = Rcs1.cbInQue;
LOOPrev1: iLen = Rcs1.cbInQue; /////////////////////////注意
CString str;
if(iLen>100){
num ++;
fprintf( fpOriginData,"COM1:");
for(int i=0;i<iLen;i++)
{
fprintf( fpOriginData,"%2x ",revBuf1[i]);
}
fprintf( fpOriginData,"\n");
}
str.Format(_T("length : %d,%d"),iLen,num);
....................}
else
{
Rol1.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);//创建Rol.hEvent为无信号状态
dwRes1= WaitForSingleObject(Rol1.hEvent,5000);//设置5s的读超时
switch(dwRes1)
{
case WAIT_OBJECT_0:
if(!GetOverlappedResult(h_com1,&Rol1,&dwRead1,TRUE)) //实际读取的字节数放在dwRead中
{
//可以使用GetLasterror()函数获取错误消息
}
else
{
//串口数据读出,可以在此加入数据处理代码
goto LOOPrev1;
}
break;
case WAIT_TIMEOUT:
//读操作出现超时错误
//超时错误处理代码
break;
default:
//默认处理代码在此书写
break;
}
}
fStopMsg1 = false; //允许事件函数发送消息
return 0;
const ULONG TheBord[3]={115200,230400,460800};
BOOL CMFCUARTDlg::ConfigConnect1()
{
DCB dcb1;
if(!GetCommState(h_com1, &dcb1))
return FALSE;
dcb1.fBinary=TRUE;
dcb1.BaudRate = TheBord[m_bord.GetCurSel()]; // 数据传输速率
dcb1.ByteSize = 8; // 每字节位数
dcb1.fParity = TRUE; //校验
//dcb1.Parity=NOPARITY; //为无校验
dcb1.Parity=ODDPARITY;
dcb1.StopBits=ONESTOPBIT; //1停止位
return SetCommState(h_com1, &dcb1);
}
BOOL CMFCUARTDlg::ConfigConnect2()
{
DCB dcb2;
if(!GetCommState(h_com2, &dcb2))
return FALSE;
dcb2.fBinary=TRUE;
dcb2.BaudRate = TheBord[m_bord.GetCurSel()]; // 数据传输速率
dcb2.ByteSize = 8; // 每字节位数
dcb2.fParity = TRUE; //校验
dcb2.Parity=NOPARITY; //为无校验
dcb2.StopBits=ONESTOPBIT; //1停止位
return SetCommState(h_com2, &dcb2);
}