来求救了,关于串口通信的,代码不懂写
导师不负责任我就只好求助网络了,测力数据采集系统,从单片机读取数据,显示到表格控件中。,
“打开串口”,每10秒从单片机读三个数据(日期,通道一,通道二,后两个是测力数据,就是纯数字),显示在表格控件中,逐行增加地显示,“关闭串口“就不再读取数据,保存按钮我已经编好了,直接读表格里面的数据进行保存的,所以关键是不知道串口那些怎么读
串口通信 单片机
[解决办法]
http://blog.sina.com.cn/s/blog_5c52ae1b0100c9dc.html
[解决办法]
想来快的就使用MSCOMM组件
首先是串口通信的基本设置和打开串口
在MSComm1Comm事件中接收
//---------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "dpj2.h"
//---------------------------------------
#pragma package(smart_init)
#pragma link "MSCommLib_OCX"
#pragma resource "*.dfm"
TForm1 *Form1;
int choosenum;
int cnum=0;
//---------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
if(MSComm1->PortOpen!=true)
{
MSComm1->CommPort=1; //设置通信端口号为COM1
MSComm1->InputMode=1; //设置串口传入数据为二进制
MSComm1->Settings = "9600,n,8,1"; //设置串口参数
MSComm1->InBufferSize=512;
MSComm1->OutBufferSize=1024;
MSComm1->RThreshold=1;
MSComm1->SThreshold=1;
MSComm1->PortOpen=true; //打开通信端口1
choosenum=1;
GroupBox2->Enabled=false; //使循环计数框失效
GroupBox3->Enabled=false; //使控制指示灯框失效
}
else
{
ShowMessage("串口已经打开");
return;
}
}
//---------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
MSComm1->PortOpen=false;
Close();
}
//---------------------------------------
void TForm1::test(String temp)//发送十六进制字符串
{
//TODO: Add your source code here
String SendStr=temp; //定义发送字符串
BYTE buff[8];
int nLength=SendStr.Length()/2;
//十六进制字符串转换成二进制字节数组
HexToBin(SendStr.c_str(),buff,nLength);
int n=nLength-1;
Variant Txbuff;
Txbuff=VarArrayCreate(OPENARRAY(int,(0,n)),varByte);
for(int i=0;i<nLength;i++)Txbuff.PutElement(buff[i],i);
MSComm1->Output=Txbuff;//发送十六进制数据
}
//------------------------
//以下为测试单片机的程序
//发送字符串“Hello”
//05 57 01 03 00 48 04 1C 发送'H' ASCII码"48"
//05 57 01 04 00 65 04 36 发送'e' ASCII码"65"
//05 57 01 05 00 6C 04 3E 发送'l' ASCII码"6c"
//05 57 01 06 00 6C 04 3D 发送'l' ASCII码"6c"
//05 57 01 07 00 6F 04 3F 发送'o' ASCII码"6f"
//05 52 01 03 00 01 04 50 读取地址03H中的值
void __fastcall TForm1::Button1Click(TObject *Sender)
{
test("055701030048041C");
Sleep(100);
test("0557010400650436");
Sleep(100);
test("05570105006C043E");
Sleep(100);
test("05570106006C043D");
Sleep(100);
test("05570107006F043F");
Sleep(100);
test("0552010300010450");
}
//---------------------------------------
//判断发送字符串是否正确
//返回 06 01 00 4F 03 4B 返回 'O'(4F) 代表'OK'正确
//返回 06 01 00 45 03 41 返回 'E'(45) 代表'ERROR'错误
//每发送一次指令,触发下面事件,返回字符串
void __fastcall TForm1::MSComm1Comm(TObject *Sender)
{
String temp;
byte buff[100];//声明一个存储接收数据的缓冲区
int ByteNum;//收到的字节数
OleVariant RxBuff;
if(MSComm1->CommEvent==comEvReceive)//表示接收缓冲区内有字符
{
if(MSComm1->InBufferCount>0)
{
RxBuff=MSComm1->Input;//接收数据
ByteNum=RxBuff.ArrayHighBound();
for(int i=0;i<=ByteNum;i++)buff[i]=RxBuff.GetElement(i);
temp=IntToHex(buff[3],2);
if(temp=="4F")
{
Edit1->Text="OK!";
GroupBox2->Enabled=true; //使循环计数框有效
GroupBox3->Enabled=true; //使控制指示灯框有效
Button1->Enabled=false;
}
if(temp=="45")
{
Edit1->Text="Error!";
Button1->Enabled=true;
}
}
}
}
//---------------------------------------
//开始计数
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Timer1->Enabled=true;
}
//---------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Timer1->Enabled=false;
}
//---------------------------------------
//05 57 01 00 00 00 04 57 数码管显示00
//05 57 01 00 00 01 04 56 数码管显示01
//05 57 01 00 00 02 04 55 数码管显示02
//05 57 01 00 00 03 04 54 数码管显示03
//05 57 01 00 00 04 04 53 数码管显示04
//05 57 01 00 00 05 04 52 数码管显示05
//05 57 01 00 00 06 04 51 数码管显示06
//05 57 01 00 00 07 04 50 数码管显示07
//05 57 01 00 00 08 04 5F 数码管显示08
//05 57 01 00 00 09 04 5E 数码管显示09
//05 57 01 00 00 0A 04 5D 数码管显示10
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
String data1,data2,data3;
int t;
cnum=cnum+1;
if(cnum>10)cnum=0;
data1="0x"+IntToStr(cnum);
Edit2->Text=cnum;
t=0x05^0x57^0x01^0x00^0x00^data1^0x04;//十六进制整数异或运算
data1=IntToHex(cnum,2);
data2=IntToHex(t,2);
data3="0557010000"+data1+"04"+data2;
test(data3);
}
//---------------------------------------
void __fastcall TForm1::RadioButton1Click(TObject *Sender)
{
choosenum=1;
}
//---------------------------------------
void __fastcall TForm1::RadioButton2Click(TObject *Sender)
{
choosenum=2;
}
//---------------------------------------
//打开指定的指示灯
//发送下面指令
//05 57 01 02 00 01 04 54 1号灯亮 蜂鸣器响
//05 57 01 01 00 01 04 57 2号灯亮 蜂鸣器响
void __fastcall TForm1::Button4Click(TObject *Sender)
{
if(choosenum==1)test("0557010200010454");
if(choosenum==2)test("0557010100010457");
}
//---------------------------------------
//关闭指定的指示灯
//发送下面指令
//05 57 01 02 00 00 04 55 1号灯灭 蜂鸣器停止响
//05 57 01 01 00 00 04 56 2号灯灭 蜂鸣器停止响
void __fastcall TForm1::Button5Click(TObject *Sender)
{
if(choosenum==1)test("0557010200000455");
if(choosenum==2)test("0557010100000456");
}
//---------------------------------------