- 論壇徽章:
- 0
|
麻煩大俠看看,給我提點(diǎn)建議 多謝了。
最近在搞一個指紋識別器的應(yīng)用。
平臺是s3c2440 linux2.6.29.1
過程是這樣的:
通過串口向指紋識別器發(fā)命令,命令執(zhí)行完后返回一ack,其中命令和ack都是按照其規(guī)定的協(xié)議來通信的。我首先在無操作系統(tǒng)下,編寫了一個讀寄存器狀態(tài)的命令,命令執(zhí)行正確,也正確收到了ack。
但是在Linux下,編寫了同樣的命令,收到的ack總要丟失字節(jié)(一個ack包是28字節(jié)),有時收到10bytes,有時收到18bytes, 有時收到25bytes,但從來沒有正確接收過!分析收到的殘缺ack包,我可以肯定命令是執(zhí)行正確了的,但為什么每次收到的數(shù)據(jù)不完整,而且就出現(xiàn)10, 18, 25這三種情況之一呢?更奇怪的是,在同樣的情況下,丟失的字節(jié)是相同的,例如5次都只收到了10bytes,那么就丟失了18bytes,并且這5次丟失的這18bytes是相同的。
我嘗試過了select,異步IO, 但得到的結(jié)果還是一樣的。。。下面是我的代碼片段:
...
void set_serial_attr(int fd)
{
tcgetattr(fd, &tio);
tio.c_cflag |= (CLOCAL | CREAD);
tio.c_cflag &= ~CSIZE;
tio.c_cflag |= CS8;
tio.c_cflag &= ~PARENB;
tio.c_cflag &= ~CSTOPB;
cfsetispeed(&tio, B57600);
cfsetospeed(&tio, B57600);
c_lflag = tio.c_lflag;
tio.c_lflag &= ~(ICANON | ECHO);
tcsetattr(fd,TCSANOW,&tio);
}
|
...
do{
select(fd+1, &rfds, NULL, NULL, NULL);
ret = read(fd, buffer_ack+count, 28);
if(ret < 0){
fprintf(stderr, "read ack failed...\n");
perror("read");
exit(1);
}else
count += ret;
DPRINTF("read count = %d\n", count); //printf the number of bytes received
}while(count != 28);
...
|
[ 本帖最后由 hellangel1984 于 2009-7-5 13:30 編輯 ] |
|