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

读串口程序死了解决办法

2013-01-06 
读串口程序死了如题,点击以后程序就死了,只能关闭了。不知道哪里写错了?void __fastcall TForm1::Button3Cl

读串口程序死了
如题,点击以后程序就死了,只能关闭了。不知道哪里写错了?
void __fastcall TForm1::Button3Click(TObject *Sender)
{
HANDLE hCom = CreateFile("COM1",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL );
if(hCom)
{
DCB dcb;
ZeroMemory(&dcb, sizeof(dcb));
dcb.DCBlength = sizeof(dcb);
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = 1;
dcb.StopBits = ONESTOPBIT;

char str[100];
DWORD wCount;//读取的字节数
BOOL bReadStat;
bReadStat = ReadFile(hCom,str,100,&wCount,NULL);
CloseHandle(hCom);
}
}
[解决办法]
设一下 COMMTIMEOUTS
COMMTIMEOUTS  CommTimeouts;
GetCommTimeouts(hCom, &CommTimeouts);
CommTimeouts.ReadIntervalTimeout = MAXDWORD;  
CommTimeouts.ReadTotalTimeoutMultiplier = 10;  
CommTimeouts.ReadTotalTimeoutConstant = 10;    
CommTimeouts.WriteTotalTimeoutMultiplier = 50;  
CommTimeouts.WriteTotalTimeoutConstant = 100; 
if (!SetCommTimeouts(hCom, &CommTimeouts))
{
CloseHandle(hCom);
return 0;
}



COMMTIMEOUTS 结构体被用在SetCommTimeouts和GetCommTimeouts 函数中,以便设置和查询通讯设备的超时参数。这个参数决定ReadFile, WriteFile, ReadFileEx, 和WriteFileEx 操作设备的行为。

typedef struct _COMMTIMEOUTS {
  DWORD ReadIntervalTimeout;
  DWORD ReadTotalTimeoutMultiplier;
  DWORD ReadTotalTimeoutConstant;
  DWORD WriteTotalTimeoutMultiplier;
  DWORD WriteTotalTimeoutConstant;} COMMTIMEOUTS, *LPCOMMTIMEOUTS;

成员

ReadIntervalTimeout
    在通讯过程中接收两个字符之间的最长超时时间,按毫秒计算。在ReadFile操作,当接收到第一个字符时,开始一个计时周期。如果接收任意两个字符之间的时隔超过本限制,ReadFile操作将完成并返回任何已缓冲的数据。0代表本参数未设置。

    如果设置为MAXDWORD, 并且ReadTotalTimeoutConstant和ReadTotalTimeoutMultiplier成员为0,代表读取操作立即返回那些已接收的数据,即使没有收到任何字符。(两个字符之间的接收间隔)
ReadTotalTimeoutMultiplier
    乘数用于计算读取操作的总超时时间,按毫秒计算。对于每个读取操作,这个值将乘以要读取的字节数。(读取单个字符的最大超时) 
ReadTotalTimeoutConstant
    一个用于计算对于读取操作的总超时周期的常数,按毫秒计算。对每次读取操作,实际总超时时间为ReadTotalTimeoutMultiplier 成员与请求的字节数年的乘积加此值。

    ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant成员为0代表总读取总超时时间无效(读取所有字节的时间为ReadTotalTimeoutMultiplier*BytesToRead+ReadTotalTimeoutConstant)。
WriteTotalTimeoutMultiplier
    乘数用来计算写操作的总超时周期,按毫秒计算。对每个写操作,这个值将乘以要写入的字节数。(写单个字符的最大超时) 
WriteTotalTimeoutConstant
    一个用于计算写入操作的总超时周期的常数,按毫秒计算。对于每一次写入操作,实际总超时时间为WriteTotalTimeoutMultiplier 成员与要写入字节的乘积再加此值.

    WriteTotalTimeoutMultiplier和WriteTotalTimeoutConstant成员为0代表总写入时间无效(写入所有字节的时间为WriteTotalTimeoutMultiplier*BytesToWrite+WriteTotalTimeoutConstant)。

备注

如果一个应用程序设置ReadIntervalTimeout和ReadTotalTimeoutMultiplier为 MAXDWORD并且设置ReadTotalTimeoutConstant 为一个大于零且小于MAXDWORD的值, 在调用ReadFile时将会发生如下现象:


    1.如果在输入缓冲区中有任何字符,ReadFile 立即返回缓冲区中的内容。
    2.如果在缓冲区中没有任何字符,ReadFile 将等待接收到一个字符并立即返回.
    3.如果在ReadTotalTimeoutConstant指定的时间值内无任何字节返回,ReadFile超时.  
[解决办法]
自己单步调试一下,那里死掉的?
[解决办法]
把我给的那段代码加到:
HANDLE hCom = CreateFile("COM1",
GENERIC_READ 


[解决办法]
 GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL );
后面就行了,粘贴都不会?还要怎么回答才清楚??
后面那段文字是解释加入的代码是什么意思的
[解决办法]
没人给发数据,怎么退出来?

热点排行