Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2342330
  • 博文数量: 816
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-17 17:57
文章分类

全部博文(816)

文章存档

2011年(1)

2008年(815)

分类:

2008-12-17 18:01:38

VictorComm1334.rar 解压缩之后的文件夹结构:
VICTOR
 \- readme.txt                  说明, 就是这个, 你没有看的, 所以不知道控件里面究竟有什么!!!!:)
 |- VCL\*.*                     串口控件
 |- DOC\YbCommHelp.chm          帮助文档, 这个你也没看到呢!!!!!:)
 \- DOC\Examples\               完整的示例程序,包括:
                |- CommMcu        与单片机通讯:超时方法帧首尾识别的例子
                |- ModemDial      Modem 拨号的例子
                |- SendBinary     二进制数据收发
                |- SendPackage    数据包收发 (带首尾和控制符格式的)
                |- SendPkgOld     与以前版本兼容的数据包收发 (带首尾和控制符的)
                |- SendText       文本收发演示程序
                |- Settings       自定义串口设置对话框,自己编 SettingsDialog 方法的对话框
                |- SmpBinary      二进制数据收发,可以判断数据校验位是否正确
                |- SmpSendFile    简单的文件收发演示程序
                \- TestSendFile   文件收发演示程序

--------------------next---------------------
我自造了100个数据发送出去,再接收回来后,在RichEdit里显示同时想存到文件里,但总是存不进去,程序倒是能运行,RichEdit里也能接到数,但数据不对,不管怎么说有数据显示,而且个数是对的,但数据存不到文件里,现把接收数据的程序附上,你帮看看是哪里出了问题?在此先谢谢了!
unsigned char Buf[8192]; //收到的字节数不会超过串口缓存的容量, 所以分配一个缓存容量相同的Buf
  int n = YbCommDevice1->Read(Buf,8192); //收到 n 个字节
  AnsiString s;

  for(int i=0; i    s += IntToStr(Buf[i]) + " ";
  s = s.Trim();

  FILE *fp;
  int Long_Int;;
  char  filename[30]="";
  StrCat(filename,Edit1->Text.c_str()); //写文件名的路径和名字.e:/data.txt
  if(!s.IsEmpty()){
    RichEdit1->Lines->Add(s);
    Long_Int=s.Length();
  if((fp=fopen(filename,"a"))==NULL)
        { MessageBox(NULL,"文件不能打开!","信息窗口",MB_OK);
         return;        }
     for(int i=0;i         if(fwrite(&s[i],1,1,fp)!=1)
         MessageBox(NULL,"写文件错误!","信息窗口",MB_OK); }
  fclose(fp);


--------------------next---------------------
数据显示错误有可能是:
1.本来数据是对的, 但显示的进制与你想的不一样, 例如你认为是16进制的, 但显示出来是10进制的, 数值是相等的。
2.你造出的100个数的范围, 按照你的接收程序理解, 应该都是无符号8位整数, 范围0-255, 是不是发送的数据也是这种类型的?

  if(!s.IsEmpty())
   {
     RichEdit1->Lines->Add(s);
     Long_Int=s.Length();
     if((fp=fopen(filename,"a"))==NULL)
      {
        MessageBox(NULL,"文件不能打开!","信息窗口",MB_OK);
        return;
      }
     for(int i=0;i       if(fwrite(&s[i+1],1,1,fp)!=1) //------------------------ AnsiString 类型从1开始, 而不是从0开始
         MessageBox(NULL,"写文件错误!","信息窗口",MB_OK);
     fclose(fp); //-------------------------------------------- 这句要放在括号里面
   }


===============================================================
你原来的程序显示10进制, 是不是显示成16进制的就对了呢?

  for(int i=0; i    s += IntToHex(Buf[i],2) + " "; //如果这样是16进制的,你原来的IntToStr是10进制的

===============================================================

AnsiString 的下标从 1 开始,而不是 0, 所以应该这样:

      for(int i=0;i       if(fwrite(&s[i+1],1,1,fp)!=1) //------------------------ AnsiString 类型从1开始, 而不是从0开始
         MessageBox(NULL,"写文件错误!","信息窗口",MB_OK);

如果这样存盘可能会更好些:
     if(fwrite(s.c_str(),1,Long_Int,fp)!=Long_Int) //不用循环, 一次存盘, 这样是否更简单呢
       MessageBox(NULL,"写文件错误!","信息窗口",MB_OK);

===============================================================

fclose(fp); //-------------------------------------------- 这句要放在括号里面
如果没打开文件而执行 fclose 会产生错误, 所以应该放在括号里面, 即只能关闭打开的文件才不会错

--------------------next---------------------
我按照你说的,AnsiString从1开始,这回数据存到文件里了,数据还是不对,我原来的数据显示程序就是如你所说的现实成16进制,但是我要知道数据对错还要反算回10进制,我嫌麻烦所以改成了IntToStr。这样吧,你帮我看看是不是本身发送的数据就有问题?先将发送的数据程序附上。
int nBytes = 0;
 char Buffer[1000],*EndPtr;
 AnsiString t,s="";
 for(i=0;i<100;i++)
   s+=IntToStr(data[i])+" ";
 while(s.Length()>0)
   {
     int p = s.Pos(' '); //空格
     if(p>0)
      {
        t = s.SubString(1,p-1);
        s = s.SubString(p+1,s.Length()).Trim();
        Buffer[nBytes++] = strtol(t.c_str(), &EndPtr, 16); //十六进制字符串转成字节
      }
     else //还剩下最后一个字节
      {
        t = s;
        s = "";
        Buffer[nBytes++] = strtol(t.c_str(), &EndPtr, 16); //十六进制字符串转成字节
      }
   }
  YbCommDevice1->Write(Buffer,nBytes);

--------------------next---------------------
计算结果好像是对的呀!
100,158,195,195,158,99,41,4,4,41,……循环

#include
M_PI 的值就是圆周率π的值, 不需要自己定义 PI 值

取整的时候采用四舍五入就更好了,那个 100 和 99 实在是不好看, 用 RoundTo(小数,保留位数) 函数
RoundTo() 的第二个参数: 0取整, -1小数点后保留1位, -2小数点后保留两位……, 1小数点前丢弃1位(个位), 2小数点前丢弃2位……

#include //用 BCB 特有的 math.hpp 里面的 RoundTo 函数, 前面的 math.h 是标准 c 的
d=RoundTo(1234567, 3); //d=1234000
d=RoundTo(1.234, -2);  //d=1.23
d=RoundTo(1.235, -2);  //d=1.24
d=RoundTo(1.245, -2);  //d=1.25
d=RoundTo(1.567, 0); //d=2
d=RoundTo(1.498, 0); //d=1

那个计算正弦值的算式改成这样:
data[i]=RoundTo(100+100*sin(x[i]),0);

结果:
100,159,195,195,159,100,41,5,5,41,……


--------------------next---------------------

阅读(1217) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~