65,187
社区成员




#include "StdAfx.h"
#include <iostream>
#define WIN32_LEAN_AND_MEAN //for GetCommState command
#include "Windows.h"
#include <WinBase.h>
using namespace std;
int main(){
char init[]="";
HANDLE serialHandle;
// Open serial port
serialHandle = CreateFile("\\\\.\\COM8", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
// Do some basic settings
DCB serialParams;
DWORD read, written;
serialParams.DCBlength = sizeof(serialParams);
if((GetCommState(serialHandle, &serialParams)==0))
{
printf("Get configuration port has a problem.");
return FALSE;
}
GetCommState(serialHandle, &serialParams);
serialParams.BaudRate = CBR_57600;
serialParams.ByteSize = 8;
serialParams.StopBits = ONESTOPBIT;
serialParams.Parity = NOPARITY;
//set flow control="hardware"
serialParams.fOutX=false;
serialParams.fInX=false;
serialParams.fOutxCtsFlow=true;
serialParams.fOutxDsrFlow=true;
serialParams.fDsrSensitivity=true;
serialParams.fRtsControl=RTS_CONTROL_HANDSHAKE;
serialParams.fDtrControl=DTR_CONTROL_HANDSHAKE;
if (!SetCommState(serialHandle, &serialParams))
{
printf("Set configuration port has a problem.");
return FALSE;
}
GetCommState(serialHandle, &serialParams);
// Set timeouts
COMMTIMEOUTS timeout = { 0 };
timeout.ReadIntervalTimeout = 3;
timeout.ReadTotalTimeoutConstant = 3;
timeout.ReadTotalTimeoutMultiplier = 3;
timeout.WriteTotalTimeoutConstant = 3;
timeout.WriteTotalTimeoutMultiplier = 3;
SetCommTimeouts(serialHandle, &timeout);
if (!SetCommTimeouts(serialHandle, &timeout))
{
printf("Set configuration port has a problem.");
return FALSE;
}
//write packet to poll data from robot
WriteFile(serialHandle,">*>p4",sizeof(">*>p4"),&written,NULL);
//check whether the data can be received
char buffer[257];
if (!ReadFile(serialHandle,buffer,sizeof(buffer),&read,NULL))
{
printf("Reading data to port has a problem.");
return FALSE;
}
int t;
bool error;
DWORD numberOfBytesRead=0;
DWORD err = GetLastError();
for (int jj=0;jj<10;jj++)
{
error=ReadFile(serialHandle,LPVOID(buffer),255,&numberOfBytesRead,NULL);
buffer[numberOfBytesRead]=0;
cout<<buffer<<endl;
cout<<error;
}
CloseHandle(serialHandle);
return 0;
}
jj++;
if(jj>=103)
break;
在你的代码里我没看见buffer被使用
你是怎么检查read都是0的?如果1000次里有999次都是0,你能看见剩下那个1不?char buffer[1];
char data[103];
int t=0;
int jj=0;
do {
ReadFile (serialHandle,&data[jj],1,&read, NULL);
cout<<read;
if (read!=0)
{
jj++;
}
t++;
} while (t<10000);
但是结果,我得到了一万个0. 我觉得奇怪的是,我实在串口能得到数据,为什么read返回的值总是0.能不能请你继续指点我?[/quote]
没加边界检查,data中只能存放103个数据,如果这段时间接收到了超过103个数据,那么就越界了
这个循环运行多长时间?这段时间内串口有没有收到数据?如果串口在这段循环运行的时间内压根没收到数据,你当然什么也读不出来[/quote]
还麻烦大神指点一下如何加边界检查,我刚才百度搜了一下,关于边界检查,啥都没搜到。
这个循环运行了挺久的,buffer只读到一个数据,因为read返回为0的原因,buffer的指针jj一直不变。但有点奇怪的是,每个循环buffer读的都是同一个数据。char buffer[1];
char data[103];
int t=0;
int jj=0;
do {
ReadFile (serialHandle,&data[jj],1,&read, NULL);
cout<<read;
if (read!=0)
{
jj++;
}
t++;
} while (t<10000);
但是结果,我得到了一万个0. 我觉得奇怪的是,我实在串口能得到数据,为什么read返回的值总是0.能不能请你继续指点我?[/quote]
没加边界检查,data中只能存放103个数据,如果这段时间接收到了超过103个数据,那么就越界了
这个循环运行多长时间?这段时间内串口有没有收到数据?如果串口在这段循环运行的时间内压根没收到数据,你当然什么也读不出来char buffer[1];
char data[103];
int t=0;
int jj=0;
do {
ReadFile (serialHandle,&data[jj],1,&read, NULL);
cout<<read;
if (read!=0)
{
jj++;
}
t++;
} while (t<10000);
但是结果,我得到了一万个0. 我觉得奇怪的是,我实在串口能得到数据,为什么read返回的值总是0.能不能请你继续指点我?