读书人

windows串口api读串口 程序卡死长时

发布时间: 2013-10-02 13:10:38 作者: rapoo

windows串口api读串口 程序卡死,长时间会蓝屏,求教
想做个qt的串口数据波形显示,但串口读出来的数据有问题,会卡死(单片机不停的发数据)

#include <stdio.h>
#include<Windows.h>
#include<iostream>
#define MAXBLOCK 80

int main(){
HANDLE hCom; //全局变量,串口句柄
hCom=CreateFile("COM3",//COM1口
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
0, //同步方式
NULL);
if(hCom==(HANDLE)-1){
printf("串口无法打开\n");
}
SetupComm(hCom,1024,1024); //输入缓冲区和输出缓冲区的大小都是1024

COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout=1000;
TimeOuts.ReadTotalTimeoutMultiplier=500;
TimeOuts.ReadTotalTimeoutConstant=5000;
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=500;
TimeOuts.WriteTotalTimeoutConstant=2000;
SetCommTimeouts(hCom,&TimeOuts); //设置超时

DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=19200; //波特率为19200
dcb.ByteSize=8; //每个字节有8位
dcb.Parity=NOPARITY; //无奇偶校验位
dcb.StopBits=ONESTOPBIT; //一个停止位
SetCommState(hCom,&dcb);

PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
unsigned char str[10];
DWORD wCount;//读取的字节数
BOOL bReadStat;
int line=0;
int total;

while(1){

int i=0;
bReadStat=ReadFile(hCom,str,10,&wCount,NULL);
total=wCount;
if(!bReadStat) {
printf("读串口失败!\n");

} else{
while(wCount--){
printf("%d:%x\n",line++,str[i]);
i++;
}

}
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);

}
}

奇怪的事情是,如果在运行这个程序之前运行一下串口调试助手,那么这个程序就能无限的读下去 api 串口 qt windows7 单片机
[解决办法]
是不是还有没初始化到的地方 启动串口工具的时候 工具也会自己初始化一次 下面仅供参考 楼主好运


BOOL ComXXX::Initialize(CString comName, int nBaudRate)
{

// 初始化变量
m_rSize = 0;
memset(m_rBuf, 0, sizeof(m_rBuf));

// 打开串口
m_hCom = CreateFile(comName,
GENERIC_READ
[解决办法]
GENERIC_WRITE,
0, // Exclusive access
NULL, // No security attributes
OPEN_EXISTING,
0, // FILE_FLAG_OVERLAPPED
NULL);
if (m_hCom == INVALID_HANDLE_VALUE) {
// 打开失败
AfxMessageBox("打开失败");
return FALSE;
}

if(nBaudRate>0) {
// 设置比特率
m_nBaudRate = nBaudRate;
}

// 取得指定串口的当前状态
DCB dcb;
if(!GetCommState(m_hCom,(LPDCB)&dcb)) {
return FALSE;
}

dcb.BaudRate = (DWORD)m_nBaudRate;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.fBinary = 1;

// 设置指定串口状态
if(!SetCommState(m_hCom, &dcb)) {
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
[解决办法]

FORMAT_MESSAGE_FROM_SYSTEM
[解决办法]

FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
0,
(LPTSTR)&lpMsgBuf,
0,
NULL);
MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK
[解决办法]
MB_ICONINFORMATION);
LocalFree(lpMsgBuf);
return FALSE;
}

// 设置超时
COMMTIMEOUTS timeouts;
timeouts.ReadIntervalTimeout= MAXDWORD; // 读间隔超时
timeouts.ReadTotalTimeoutMultiplier= 0; // 读时间系数
timeouts.ReadTotalTimeoutConstant= 0; // 读时间常量
timeouts.WriteTotalTimeoutMultiplier= 0; // 写时间系数
timeouts.WriteTotalTimeoutConstant= 1500; // 写时间常量(1.5秒后写超时)

if (!SetCommTimeouts(m_hCom, &timeouts)) {


// 设置超时失败
return FALSE;
}

// 设置串口读缓冲和写缓冲的大小
SetupComm(m_hCom, 1024*4, 512*4);

// 清空串口读写缓冲区
PurgeComm(m_hCom, PURGE_RXCLEAR
[解决办法]
PURGE_TXCLEAR);

// 启动线程
IsComStateOnFree= false;
m_comThread = AfxBeginThread(CComIO::RecvHandler, this, THREAD_PRIORITY_HIGHEST);
m_bExitFlag = FALSE;



return TRUE;
}


[解决办法]
要用异步事件,参考http://www.vckbase.com/index.php/wv/1439.html

引用:
想做个qt的串口数据波形显示,但串口读出来的数据有问题,会卡死(单片机不停的发数据)
#include <stdio.h>
#include<Windows.h>
#include<iostream>
#define MAXBLOCK 80

int main(){
HANDLE hCom; //全局变量,串口句柄
hCom=CreateFile("COM3",//COM1口
GENERIC_READ
[解决办法]
GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
0, //同步方式
NULL);
if(hCom==(HANDLE)-1){
printf("串口无法打开\n");
}
SetupComm(hCom,1024,1024); //输入缓冲区和输出缓冲区的大小都是1024

COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout=1000;
TimeOuts.ReadTotalTimeoutMultiplier=500;
TimeOuts.ReadTotalTimeoutConstant=5000;
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=500;
TimeOuts.WriteTotalTimeoutConstant=2000;
SetCommTimeouts(hCom,&TimeOuts); //设置超时

DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=19200; //波特率为19200
dcb.ByteSize=8; //每个字节有8位
dcb.Parity=NOPARITY; //无奇偶校验位
dcb.StopBits=ONESTOPBIT; //一个停止位
SetCommState(hCom,&dcb);

PurgeComm(hCom,PURGE_TXCLEAR
[解决办法]
PURGE_RXCLEAR);
unsigned char str[10];
DWORD wCount;//读取的字节数
BOOL bReadStat;
int line=0;
int total;

while(1){

int i=0;
bReadStat=ReadFile(hCom,str,10,&wCount,NULL);
total=wCount;
if(!bReadStat) {
printf("读串口失败!\n");

} else{
while(wCount--){
printf("%d:%x\n",line++,str[i]);
i++;
}

}
PurgeComm(hCom,PURGE_TXCLEAR
[解决办法]
PURGE_RXCLEAR);

}
}

奇怪的事情是,如果在运行这个程序之前运行一下串口调试助手,那么这个程序就能无限的读下去

读书人网 >C语言

热点推荐