Windows与UNIX通讯问题(主要是收数据不全问题,1000分!)

lizhoulun 2005-09-02 11:24:43
Windows与UNIX通讯问题(主要是收数据不全问题,1000分!)

UNIX系统是采用多功能串口卡,其中有一个串口与我的PC电脑通讯。UNXI系统端是25针,我这端是9针,都是公头(也就是带针的)
我这端程序是:
AnsiString SEND_TMEP="$ABCD|E364010010G00G0245|P00L05|";
commData->ClearSendBuf();
//发送数据为:
commData->WriteData((unsigned char*)(SEND_TMEP.c_str()),SEND_TMEP.Length());

UNIX是一个不停的检查函数,如果受到我的AskStr,并且为32为长度,则证明是合法的,返回为0;否则返回为-1,并且继续检查。
代码为一个函数如下:
int Get_Status(int fd,char *Reci_Data)
{
int i,j;
int read_size;
int timeout;
char buffer[512];
char tmpbuf[512];
char TradeCode[5];

memset(TradeCode,0,sizeof(TradeCode));
memset(buffer,0,sizeof(buffer));
memset(tmpbuf,0,sizeof(tmpbuf));
//开始是读一次,但是读一次不行,只能读到前面16个字符,就是$ABCD|E364010010,后面的G0245|P00L05|读不到。
所以我就注销了下行,采用两次读的方法。
//read_size=read(fd,buffer,sizeof(buffer));

//两次读的方法如下:
i=0;
timeout=6;
while(i<2)
{
if(timeout<0)
break;
read(fd,tmpbuf,sizeof(tmpbuf));
//读两次后,相连接
strcat(buffer,tmpbuf);
//StrCount函数是返回 字符串buffer 中的 $ 个数
i=StrCount(buffer,'$');


if(i==1)
{
if(strlen(buffer)>=32)
break;
}
timeout--;
sleep(1);
}
//输入到UNXI屏幕
fprintf(stderr,"StrCount strlen(buffer)=%d,buffer=%s\n",strlen(buffer),buffer);
if(strlen(buffer)<32)
{
if(strlen(buffer)>0)
{
strcpy(buffer,"ER2$");
write(fd,buffer,strlen(buffer));
}
return (-1);
}
memset(tmpbuf,0,sizeof(tmpbuf));
for( j=0;j<strlen(buffer);j++)
{
if(buffer[j]=='$')
{
strncpy(tmpbuf,buffer+j+1,31);
tmpbuf[31]=0;
break;
}
}

if(strlen(tmpbuf)<4)
return(-1);

strncpy(TradeCode,tmpbuf,4);
if ((!strcmp(TradeCode,"ABCD")) || (!strcmp(TradeCode,"abcd")))
{
//正确后的结果
strcpy(Reci_Data,tmpbuf);
return(0);
}
else
{
return(-1);
}
}

现在问题是:
1)每次只能读16个,即使我采用两次相连接方法,UNIX的最后收到错误的是 $ABCD|E364010010$ABCD|E364010010 ;正确的是 $ABCD|E364010010G00G0245|P00L05|
怎么办
2)每次发送完毕后,我的PC要重新启动一下。或者把串口线拔掉重插才好,真不知道怎么回事情?
3)串口线的做法(连接)是怎么最好?
谢谢!




...全文
277 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ahaozi 2005-09-28
  • 打赏
  • 举报
回复
楼主,要是搞串口通讯,我觉得你最好是定义一个包头,比如说10个0xFF,包尾10个0x0D,为什么要这么做,因为可能串口上不太稳定,发连续的1过去可以将状态设置一至,然后你在接收方时就一个个字符接收。这样子收到有10个0x0D时就处理。我一直是这么用的,而且这样子可以处理数据流!
signed 2005-09-06
  • 打赏
  • 举报
回复
请问:
回复人: songhtao(三十年孤独) ( ) 信誉:131 2005-09-06 08:40:00 得分: 0


用Mscomm控件又快又方便。


UNIX端可用?
FengSC 2005-09-06
  • 打赏
  • 举报
回复
用串口调试工具,先确定PC确实发出了32个字符,在将这32个字符发送到UNIX,明确了问题在哪边以后再分析处理。
我不懂电脑 2005-09-06
  • 打赏
  • 举报
回复
用Mscomm控件又快又方便。
leonatcs 2005-09-06
  • 打赏
  • 举报
回复
mscomm是个activeX控件,可能没法在Unix上用。
turbopower apro 可以在kylix上用,不知能不能拿来。
rainboyfdy 2005-09-05
  • 打赏
  • 举报
回复
对,可能是没有CLOSECOM
signed 2005-09-05
  • 打赏
  • 举报
回复
要重新启动或把串口可能是因为你没关闭设备,然后再打开
signed 2005-09-05
  • 打赏
  • 举报
回复
main()
{
FILE *com;

char buf[300];
bool dataflag=false;

while(1){

if((com=fopen("c:\\1.txt"/*设备号*/,"rt"))==NULL){
fprintf(stderr,"不能打开设备:%s!\n",""/*设备号*/);
exit(1);
}
memset(buf,0x00,sizeof(buf));
int c;
int i=0;
dataflag=false;

do
{
c=fgetc(com);
if(c==EOF)
break;
if(c=='$')
{ //开始符,如果不定长建议使用结束符号
dataflag=true;
i=0;
}
if(dataflag)
buf[i++]=c;
}while(i<32);
fclose(com);
//fprintf(stderr,"设备已关闭");
if(dataflag){
buf[i]=0x00;
fprintf(stderr,"收到数据:%s",buf);
//处理数据
}



}
//getch();
}
rainboyfdy 2005-09-05
  • 打赏
  • 举报
回复
数据丢失的可能原因:估计是你的UNIX串口缓冲太小,估计缓冲就是16字节,UNIX第一次读缓冲里的16个字节后还有后续处理,UNIX后续处理的时候PC机继续发送数据,缓冲区内就会有些数据被冲掉.UNIX再读16位时将会数据丢失.如果是这个原因,解决方法:
1.PC机每发送16字节等待一会
2.UNIX缓冲加大

2)每次发送完毕后,我的PC要重新启动一下。
?????什么意思?不重起会有什么结果????

3)串口就是23对接,地接地
signed 2005-09-05
  • 打赏
  • 举报
回复
串口线就RS232,23交换,5直连即可
signed 2005-09-05
  • 打赏
  • 举报
回复
我要拿着一千分,代码,发过来
signed 2005-09-05
  • 打赏
  • 举报
回复
还没解决?

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧