我现在正在使用C学习与win32的串行通信。从串口读取如下。
DWORD dwEventMask;
DWORD dwSize;
if(!SetCommMask(hSerial, EV_RXCHAR)){
//Error handling
printf("Error Setting Comm Mask \n");
}
if(WaitCommEvent(hSerial, &dwEventMask, NULL))
{
unsigned char szBuf[1024];
DWORD dwIncommingReadSize;
do
{
if(ReadFile(hSerial, &szBuf, 1, &dwIncommingReadSize, NULL) != 0) {
//Handle Error Condition
}
if(dwIncommingReadSize > 0)
{
dwSize += dwIncommingReadSize;
sb.sputn(&szBuf, dwIncommingReadSize);
printf("Reading from port \n");
}
else{
//Handle Error Condition
}
printf("Reading data from port \n");
} while(dwIncommingReadSize > 0);
}
else
{
//Handle Error Condition
}
他们使用DWORD dwIncommingReadSize for while condition(while(dwIncommingReadSize> 0);.
请解释这种情况如何令人满意。没有修改可见。
请再次解释以下部分。
if(dwIncommingReadSize > 0)
{
dwSize += dwIncommingReadSize;
sb.sputn(&szBuf, dwIncommingReadSize);
printf("Reading from port \n");
}
答案 0 :(得分:2)
这一行:
if(ReadFile(hSerial, &szBuf, 1, &dwIncommingReadSize, NULL)
将dwIncommingReadSize
的地址传递给该函数(不管它是否拼写错误),以便它可以将其更改为任何想要的地址。
它类似于:
void fn (int *x) { *x = 42; }
:
int xyzzy = 1;
fn (&xyzzy);
// Here, xyzzy is now 42.
就你的第二个问题而言,如果没有看到更多的代码就很难说,但看起来它只是增加了读入的每个数据块的“总大小”变量(加上{{1}应该这样做。
这是典型的情况,单个读取可能无法获得您想要的所有数据 - 您只需存储所获得的数据,然后返回以获取更多数据。