C++Builder 程序员博客
21 Aug
这是一个串口通讯的程序(网上下的),可是我不知道她从串口接受的数据方在哪里的?我要想串口写数据,该怎么写?请哪位大侠帮一下小弟。说的越详细越好!!!非常感谢了。急急急啊!!!!!!
#include <windows.h>
#include <stdio.h>
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <fstream>
using namespace std;
#include <io.h>
#include <string.h>
#include <process.h>
HANDLE hCom ; // 准备打开的串口的句柄
HANDLE hCommWatchThread ; //辅助线程的全局函数
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
UINT CommWatchProc(HWND hSendWnd)
{
DWORD dwEvtMask=0 ;
COMSTAT ComStat ;
DWORD dwErrorFlags,dwLength,dwError;
BOOL fReadStat = FALSE;
LPSTR lpBuffer = NULL;
SetCommMask( hCom, EV_RXCHAR ¦EV_TXEMPTY );//有哪些串口事件需要监视?
WaitCommEvent( hCom, &dwEvtMask, NULL );// 等待串口通信事件的发生
//检测返回的dwEvtMask,知道发生了什么串口事件
if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR) // 缓冲区中有数据到达
{
ClearCommError(hCom, &dwErrorFlags, &ComStat ) ;
dwLength = ComStat.cbInQue ; //输入缓冲区有多少数据?
if (dwLength > 0)
{
fReadStat = ReadFile(hCom, lpBuffer, dwLength, &dwLength ,NULL); //读数据
if (!fReadStat)
{
if (GetLastError() == ERROR_IO_PENDING)
{
while(!GetOverlappedResult(hCom,NULL, & dwLength, TRUE))
{
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE) continue;
}
}
}
//::PostMessage((HWND)hSendWnd,WM_NOTIFYPROCESS,0,0);//通知主线程,串口收到数据
}
}
return 0;
}
int SerialInit( ) ; //串口初始化
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine,int nCmdShow)
{
static TCHAR szAppName[]=TEXT("HelloWorld");
static TCHAR szClassName[]=TEXT("HelloWorldClass");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
unsigned long * p=NULL;
wndclass.style = CS_HREDRAW ¦ CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szClassName;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("This program requires Windows NT !"),
"szAppName",MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(szClassName,
TEXT("My Input Program"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL );
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
SerialInit( );//串口初始化
//*****************开辟新线程********************************************
hCommWatchThread=CreateThread((LPSECURITY_ATTRIBUTES) NULL,//安全属性
0, //初始化线程栈大小,却省为与主线程大小相同
(LPTHREAD_START_ROUTINE)CommWatchProc, //线程的全局函数
NULL, //此处传入了主框架的句柄
0,p);
//*****************开辟新线程********************************************
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
int SerialInit( ) //初始化串口
{
// DWORD dwError;
DCB dcb;
COMMTIMEOUTS to;
BOOL fSuccess;
//**************************打开串口***************************
hCom = CreateFile("COM1", GENERIC_READ ¦ GENERIC_WRITE, 0,
NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
if (hCom == INVALID_HANDLE_VALUE)
{
MessageBox(NULL,TEXT("打开串口错误!"),
"ok",MB_ICONERROR);
}
//***************************打开串口****************************
//***************************配置串口****************************
GetCommState(hCom,&dcb);
dcb.BaudRate = 9600; //波特率为9600
dcb.ByteSize = 8; //数据位数为8位
dcb.Parity = NOPARITY; //无校验
dcb.StopBits = ONESTOPBIT; //一个停止位
dcb.fBinary = FALSE;
if(!SetCommState(hCom,&dcb))
{
MessageBox(NULL, TEXT("设置错误"), "OK", MB_ICONERROR);
}
SetupComm(hCom, 1024, 1024);
//PurgeComm(hCom, PURGE_TXCLEAR);
PurgeComm( hCom, PURGE_TXABORT ¦ PURGE_RXABORT ¦ PURGE_TXCLEAR ¦ PURGE_RXCLEAR ); //清干净输入、输出缓冲区
//***************************配置串口****************************
//******************将串口读操作的超时设定为10 毫秒**************
memset(&to, 0, sizeof(to));
to.ReadIntervalTimeout = 10000;
SetCommTimeouts(hCom, &to);
//******************将串口读操作的超时设定为10 毫秒**************
//******************设置事件掩模来监视指定通信端口上的事件(监视串口的错误和接收到字符两种事件)********
fSuccess=SetCommMask(hCom, EV_RXCHAR ¦EV_TXEMPTY );//设置事件驱动的类型
if (!fSuccess)
{
MessageBox(NULL, TEXT("SetCommMask 错误"), "OK", MB_ICONERROR);
}
//******************设置事件掩模来监视指定通信端口上的事件(监视串口的错误和接收到字符两种事件)********
return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,
LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
char temp[128];
switch(message)
{
case WM_CREATE:
return 0;
//获取键盘输入
case WM_KEYDOWN:
switch(wParam)
{
//按Esc键推出
case VK_ESCAPE:
PostQuitMessage(0);
return 0;
}
//其余按键发声
MessageBeep(MB_OK);
return 0;
//按下鼠标左键发声
case WM_LBUTTONDOWN:
MessageBeep(MB_OK);
return 0;
//按下鼠标右键退出
case WM_RBUTTONDOWN:
PostQuitMessage(0);
return 0;
//鼠标位置改变,显示坐标
case WM_MOUSEMOVE:
hdc = GetDC(hwnd);
sprintf(temp,"x: %d , y: %d",LOWORD(lParam),HIWORD(lParam));
TextOut(hdc,10,10,temp,strlen(temp));
ReleaseDC(hwnd,hdc);
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect);
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
我给你个例子,你自己看看
发过去了
非常感谢,还有哪些大哥能帮我啊?请快点吧。。
小弟非常着急啊。。。
请哪位帮我分析一下这个程序。。。
不胜感激!!!
怎么没有人说话呢????