API BCB6短信收发程序问题

swordwins 2007-03-06 10:10:24
遇到一个很奇怪的问题:当送出命令后只能收到手机回送的前一段字符,例如:发送
at+cgmi后,只收到"at+cgmi",后面就再也收不到东西,高人指点,是什么问题啊?
...全文
476 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
睿音 2007-08-21
  • 打赏
  • 举报
回复
ClearCommError(hComm,&dwError,&cs);
if (cs.cbInQue != 0)
{
Sleep(FTimeOut);
ClearCommError(hComm,&dwError,&cs);
ReadFile(hComm,RxBuff,cs.cbInQue,&nBytesRead,NULL);
...
}
用GetCommState也可以。
用途是获取cbInQue中的值。也就是串口缓冲区中的内容。
swordwins 2007-03-19
  • 打赏
  • 举报
回复

DeviceHandle=CreateFile(DeviceName.c_str(),
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(DeviceHandle==INVALID_HANDLE_VALUE)
{
Memo2->Lines->Add("打开串口"+DeviceName+"失败,请确认短信设备连接到该端口!");
return;
}
GetCommState(DeviceHandle, &MyDCB);
MyDCB.DCBlength = sizeof(DCB);
MyDCB.BaudRate=ComboBox_BaudRate->Text.ToInt();
MyDCB.ByteSize = 8;
MyDCB.StopBits = ONESTOPBIT ;
MyDCB.Parity = NOPARITY ;
if(!SetCommState(DeviceHandle, &MyDCB))
{
Memo2->Lines->Add("通讯端口"+DeviceName+"设置失败!");
return;
}

GetCommTimeouts(DeviceHandle,&OriginalTimeouts);
OriginalTimeouts.ReadIntervalTimeout=15;
OriginalTimeouts.ReadTotalTimeoutMultiplier=1;
OriginalTimeouts.ReadTotalTimeoutConstant=2500;
OriginalTimeouts.WriteTotalTimeoutMultiplier=1;
OriginalTimeouts.WriteTotalTimeoutConstant=250;
SetCommTimeouts(DeviceHandle,&OriginalTimeouts);
ReceiveQueue=32;
TransmitQueue=9;
SetupComm(DeviceHandle,1024*ReceiveQueue,1024*TransmitQueue);
swordwins 2007-03-19
  • 打赏
  • 举报
回复
是啊。怎么都不行,收不完。寄怪得很
kangji 2007-03-15
  • 打赏
  • 举报
回复
你的问题还没有解决吗?
swordwins 2007-03-14
  • 打赏
  • 举报
回复
怎么没有人响应啊,真是急死个人。
swordwins 2007-03-08
  • 打赏
  • 举报
回复
为什么啊,有什么用啊
kangji 2007-03-08
  • 打赏
  • 举报
回复
if(cs.cbInQue<1) return;
之前加一个GetCommState(DeviceHandle, &cs);
ljianq 2007-03-07
  • 打赏
  • 举报
回复
不是API的问题,而是通讯协议没有搞好
swordwins 2007-03-07
  • 打赏
  • 举报
回复
麻烦看看哪里有问题
swordwins 2007-03-07
  • 打赏
  • 举报
回复
void __fastcall thRcvComChar::Execute()
{
DWORD beginTickCount;
SetName();
memset(RcvBuf, 0x00, sizeof(RcvBuf));
if(lpData==NULL)
{
MyInfoMemo->Lines->Add("共享内存区未建立或异常!");
ReturnValue=0;
Terminate();
}
beginTickCount=GetTickCount();
while((AnsiString(RcvBuf).Pos("OK")!=0)||(AnsiString(RcvBuf).Pos("ERROR")!=0)||Terminated==false)
{
//Sleep(250);
Synchronize(GetData);
if(GetTickCount()-beginTickCount>10*1000L) break;
}
if(AnsiString(RcvBuf).Pos("OK")!=0)
ReturnValue=1;
else if(AnsiString(RcvBuf).Pos("ERROR")!=0)
ReturnValue=-1;
else
{
ReturnValue=-2;
Terminate();
}
memset (lpData, 0x00, 10240);
memcpy (lpData, RcvBuf, 10240);
}
//---------------------------------------------------------------------------

void __fastcall thRcvComChar::GetData()
{
AnsiString tmpstr="";
DWORD nBytesRead,dwEvent,dwError;
COMSTAT cs;
if(DeviceHandle==INVALID_HANDLE_VALUE)
{
MyInfoMemo->Lines->Add("短信设备连接异常!");
ReturnValue=0;
Terminate();
}
if(ClearCommError(DeviceHandle, &dwError, &cs)==false)
{
MyInfoMemo->Lines->Add("ClearCommError() Error") ;
Terminate();
}
tmpstr="";
if(cs.cbInQue<1) return;
if(cs.cbInQue>10240)
{
PurgeComm(DeviceHandle, PURGE_RXCLEAR); //清除通讯端口数据
return;
}
tmpstr.SetLength(cs.cbInQue);
ReadFile(DeviceHandle, (void *)tmpstr.data(), cs.cbInQue, &nBytesRead, NULL);
if(nBytesRead>0)
{
strcat(RcvBuf, tmpstr.Trim().c_str());
MyInfoMemo->Lines->Add(RcvBuf);
}
}
swordwins 2007-03-07
  • 打赏
  • 举报
回复
我是一直在读啊,只读出这些后面就没反映了。
futulove 2007-03-07
  • 打赏
  • 举报
回复
有没有可能一次只能读出部分,要多读几次加起来才正确的。
swordwins 2007-03-07
  • 打赏
  • 举报
回复
通讯协议应该怎么做呢?
swordwins 2007-03-06
  • 打赏
  • 举报
回复
没作处理啊,要处理吗?我是用线程来接收的
kangji 2007-03-06
  • 打赏
  • 举报
回复
后面有回车换行符号,你是怎么接收 的?
swordwins 2007-03-06
  • 打赏
  • 举报
回复
什么意思哦,AT+cgmi后面还有东西才对,应该有手机的生产厂家信息出来才对啊,光是AT+cgmi肯定不对啊
FFSB 2007-03-06
  • 打赏
  • 举报
回复
AT+cgmi看收到的结果是
AT+cgmi or AT+CGMI.
再做分析
我不懂电脑 2007-03-06
  • 打赏
  • 举报
回复
类似于tcp/ip是流式协议,需要不断的读,组合成命令。
swordwins 2007-03-06
  • 打赏
  • 举报
回复
我用的是API,OpenFile()、WriteFile()、ReadFile()
FFSB 2007-03-06
  • 打赏
  • 举报
回复
BCB6有收发短信的API?
是用的第三方控件?

1,317

社区成员

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

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