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) |