首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

windows串口api读串口 程序卡死,长时间能蓝屏,求教

2013-10-02 
windows串口api读串口 程序卡死,长时间会蓝屏,求教想做个qt的串口数据波形显示,但串口读出来的数据有问题,

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); 

}
}

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

热点排行