串口发送双精度数组问题?

a995733 2013-05-10 10:12:33
下位机采集到的数据需要传送到上位机处理;下位机一次采集1万个双精度数据,需要1次传输到上位机;我用CserialPort试写了个串口传送程序,如下:

1.发送程序:
void CSerialPortTestDlg::OnButtonSend()
{

if (!m_bSerialPortOpened) return;


double a[20],b[20];

a[0]=1.125;
a[1]=2.225;
a[2]=3.223;
a[3]=4.223;
a[4]=5.223;
a[5]=6.125;
a[6]=7.225;
a[7]=8.223;
a[8]=9.223;
a[9]=10.223;
a[10]=11.125;
a[11]=12.225;
a[12]=13.223;
a[13]=14.223;
a[14]=15.223;
a[15]=16.125;
a[16]=17.225;
a[17]=18.223;
a[18]=19.223;
a[19]=20.223;

int len=20*sizeof(double);
int len1=len+2;

char * byte=new char[len1];
memset(byte,0,len1);
memcpy(&byte[1],a,len);
byte[0]='$';
byte[len1-1]='*';
memcpy(b,&byte[1],len);

m_SerialPort.WriteToPort((char*)byte,len1);


}
2.接收程序:
LONG CSerialPortTestDlg::OnComm(WPARAM ch, LPARAM port)
{
static char buf[162];
static int count=0;

switch(ch)
{
case '$':
count=0;
buf[count]=(char)ch;
break;
case '*':
{
int len=20*sizeof(double);
double b[20];

memcpy(b,&buf[1],len);
display();

}
break;
default:
count++;
buf[count]=(char)ch;
break;
}
return 0;
}
现在的问题是:
1.发送程序一次发送数据小于10个double时,接收正确;
2.发送程序一次发送数据大于10个double时,接收不正确;
3.发送程序一次发送数据20个double时,接收不正确,并且messagebox跳出来两次;
求求各位高手给点建议,多谢!!!!!!!!!!!
...全文
130 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiter 2013-05-14
  • 打赏
  • 举报
回复
路过,学习经验来了
hdg3707 2013-05-11
  • 打赏
  • 举报
回复
另外,你不要按字符形式发,要按二进制发,字符形式发会遇到0截止。同时,把数据变成整数再发,接收方再转成小数点,不要把带小数点的数据直接转成字符型,这样可能有问题
hdg3707 2013-05-11
  • 打赏
  • 举报
回复
串口通信速率慢,所以一次不能发送太多,但你一次发40个字节应该没问题,除非你的波特率设得太高(设成115200),这样,数据一多就可能出错。 1个double是4个字节,一万个数据就是40000个字节,这样一次肯定不能发完,你只能多次发才行。 另外,你先用串口助手接收试试可靠性,也许是下位机的问题,通信涉及到双方的配合,出问题后要双方共同判断原因并共同解决,不能光指着一方。
zgl7903 2013-05-10
  • 打赏
  • 举报
回复
你是直接发送的十六进制的数据 因此在数据的任何位置都可能会被判断成帧头或帧尾
使用较长的帧头帧尾(减少数据与帧标识相配的概率)
或把数据转换成asc码发送(当然传输效率将会降低)
另外最好加校验 避免突发错误造成脏数据
zgl7903 2013-05-10
  • 打赏
  • 举报
回复
你是直接发送的十六进制的数据 因此在数据的任何位置都可能会被判断成帧头或帧尾
使用较长的帧头帧尾(减少数据与帧标识相配的概率)
或把数据转换成asc码发送(当然传输效率将会降低)
另外最好加校验 避免突发错误造成脏数据
zgl7903 2013-05-10
  • 打赏
  • 举报
回复
你是直接发送的十六进制的数据 因此在数据的任何位置都可能会被判断成帧头或帧尾
使用较长的帧头帧尾(减少数据与帧标识相配的概率)
或把数据转换成asc码发送(当然传输效率将会降低)
另外最好加校验 避免突发错误造成脏数据

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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