C++串口通信 WriteFile函数疑惑
小子是C++小白,最近要实现一个随动机械臂的项目,实现的框架是kinect+VS2015+opencv+arduino
苦于C++与arduino的通信难以实现,尝试学习串口通信,对WriteFile函数的疑惑困扰小子不短时间,急求解惑。
//代码如下
/ chuankouxuexi.cpp : Defines the entry point for the console application.
//
#include <afx.h>
#include "stdafx.h"
#include "windows.h"
#include "iostream"
#include "stdio.h"
using namespace std;
DWORD WINAPI ThreadOne(LPVOID lpParameter)
{
/**int i = 0;
for (i = 0; i < 10; i++)
{**/
cout << "thread one is running " << (char *)lpParameter << endl;
/**if (i == 5)
{
//关闭线程自己
ExitThread(300);
}
}**/
return 0;
}
int main()
{
HANDLE FILE;
DWORD dwerror;
FILE = CreateFile(_T("COM4"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);//FILE_FLAG_OVERLAPPED 异步通信
if (FILE == (HANDLE)0xFFFFFFFF);
{
dwerror = GetLastError();
cout << dwerror << endl;/***************
【0】-操作成功完成。
【1】 - 功能错误。
【2】 - 系统找不到指定的文件。
【3】 - 系统找不到指定的路径。
【4】 - 系统无法打开文件。
【5】 - 拒绝访问。
【6】 - 句柄无效。**********/
//MessageBox(NULL,str,TEXT("错误报告"), MB_OK);//*******************//MB_ICONINFORMATION | MB_YESNO
}
system("pause");
DCB dcb;
dcb.BaudRate = 9600; //波特率为9600 dcb.BaudRate
dcb.ByteSize = 32; //数据位数为32位 dcb.ByteSize
dcb.Parity = EVENPARITY; //偶校验 dcb.Parity
dcb.StopBits = 2; //两个停止位 dcb.StopBits
dcb.fBinary = TRUE;
dcb.fParity = TRUE; //TRUE 不是TRue
if (!SetCommState(FILE, &dcb))
{
cout << "串口设置出错!" << endl;
}
system("pause");
SetupComm(FILE, 1024, 1024); //分配缓存区,输入缓存区,输出缓存区
memset(&FILE, 0, sizeof(FILE));
COMMTIMEOUTS timeout;
memset(&timeout, 0, sizeof(timeout));//void *memset(void *s, int ch, size_t n); [3]memset函数解释:将 s 中后 n 个字节 (typedef unsigned int size_t)用 ch 替换并返回 s 。
//memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。sizeof()
timeout.ReadIntervalTimeout = MAXWORD;
timeout.ReadTotalTimeoutMultiplier = 0;
timeout.ReadTotalTimeoutConstant = 0;
timeout.WriteTotalTimeoutMultiplier = 50;
timeout.WriteTotalTimeoutConstant = 50;
SetCommTimeouts(FILE, &timeout);
HANDLE hCommWatchThread;//建立线程
hCommWatchThread = CreateThread((LPSECURITY_ATTRIBUTES)NULL, //安全属性
0,//初始化线程栈的大小,缺省为与主线程大小相同
(LPTHREAD_START_ROUTINE)ThreadOne, //线程的全局函数
"Testone", //此处传入了主框架的句柄
0, NULL);
if (hCommWatchThread == NULL)
{
cout << "open thread fail" << endl;
}
system("pause");
OVERLAPPED overlap;
int x = 100;
DWORD dwWritenSize;
overlap.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); //创建读取数据的句柄
WriteFile(FILE, &x, 4, &dwWritenSize, &overlap);
BOOL bRet = ::WriteFile(FILE, &x, 4, &dwWritenSize, &overlap);
if (bRet)
{
cout << "write file successfully" << endl;
}
else
{
DWORD dwError = GetLastError();
cout << dwError << endl; //提示句柄无效
/** 清空串口缓冲区 */
PurgeComm(FILE, PURGE_RXCLEAR | PURGE_RXABORT);
//return false;
}
system("pause");
BOOL ReadData = TRUE;
ReadData = ReadFile(FILE, &x, 1, &dwWritenSize, NULL);
cout << ReadData << endl;
system("pause");
return 0;
}
运行结果,错误:句柄无效,还有建立的线程怎么用?急求解惑