前言
主要利用C#通过串口通信控制步进电机和安捷伦信号源。
一、串口通信
第一步通过串口RS232控制步进电机,CSDN上很多串口通信示例,下面直接上代码
private void Form1_Load(object sender, EventArgs e)
{
string[] strCom = SerialPort.GetPortNames();
if (strCom == null)
{
MessageBox.Show("本机没有串口!", "Error");
return;
}
foreach (string com in strCom)
{
cbCom.Items.Add(com);
}
cbCom.SelectedIndex = 0;
sp1.PortName = cbCom.Items[0].ToString();//串口号
sp1.BaudRate = 9600;
Control.CheckForIllegalCrossThreadCalls = false;
sp1.DataReceived += Sp1_DataReceived;
// sp1.DataReceived += new SerialDataReceivedEventHandler(Sp1_DataReceived);
sp1.DtrEnable = true;
sp1.RtsEnable = true;
sp1.ReadTimeout = 1000;
sp1.Close();
cbBaudRate.Text = "9600";
cbDataBits.Text = "8";
cbStop.Text = "1";
cbCheck.Text = "无";
}
private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
System.Threading.Thread.Sleep(100); //延时100ms等待接收数据
//this.Invoke 跨线程访问ui的方法
this.Invoke((EventHandler)(delegate
{
if (isHex == false)
{
tbxRecvData.Text += sp.ReadLine();
//Azi_fpos = sp.ReadExisting();
}
else
{
Byte[] ReceivedData = new Byte[sp.BytesToRead];
sp.Read(ReceivedData, 0, ReceivedData.Length);
String RecvDataText = null;
for (int i = 0; i < ReceivedData.Length - 1; i++)
{
RecvDataText += ("0x" + ReceivedData[i].ToString("X2") + " ");
}
tbxRecvData.Text += RecvDataText;
}
sp.DiscardInBuffer(); //丢弃接收缓冲区数据
}));
}
这里需要注意的是有个事件,如果需要每次send发送完数据就立马收数据的话可以用,如果不是的话可以手动接收sp.ReadExisting();
//定义DataReceived事件,当串口收到数据后触发事件
//sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
第二步当通信成功后我们需要通过指令来控制步进电机,这时候就需要查询用户手册并调试。当然在这之前可以还需要一个串口调试助手更有效的验证,下面分享两个串口助手给大家
1是win10自带的串口调试助手,
2是360 软件下载
调试通过后,就可以接下的步骤。
二、VISA和SCPI
SCPI(可编程仪器的标准命令)是一种基于 ASCII 的仪器命令语言,供测试和测量仪器使用,简单来说就是你发送给一个设备一串SCPI格式的字符串,它就能完成相应操作,这就是它们的通用语言。SCPI分为标准SCPI和扩展的SCPI,前者是各种设备通用的,如重置命令RST,后者是各个厂家各种设备自己扩展的命令。如果相应设备支持SCPI,在其操作手册中会对SCPI详细说明,最好是查看需要控制的设备说明文档。
VISA(Virtual Instrument Software Architecture,简称为"Visa"),即虚拟仪器软件结构,是VXI plug&play联盟制定的I/O接口软件标准及其规范的总称。VISA提供用于仪器编程的标准I/O函数库,称为VISA库。计算机通过它来控制仪器。
VISA的适用和各种仪器接口通信,无论仪器使用的串口还是其他任何一种总线,诸如USB、GPIB、VXI、PXI和LXI等,都具有相同的操作函数,从而实现了控制操作上的统一。
安捷伦等仪表通讯需要用到VISA的库。库的获取方法目前知道两个,1个是下载是德科技的IO Library,还有就是上NI下载NI-VISA.
1.引入库
在项目中添加引用,引用VISA的库。
2.编写安捷伦信号源程序
VISA程序集不支持太老的安捷伦设备,需另行解决可以通过LAN或者GPIB等
//方法:实现设备连接
public void Connect(string address)
{
ResourceManager con = new ResourceManager();
FormattedIO488 ioobj = new FormattedIO488();
try
{
ioobj.IO = (IMessage)con.Open(address, AccessMode.NO_LOCK, 2000, "");
ioobj.WriteString("*IDN?", true);
string message = ioobj.ReadString();
if (message != "")
{
RecList("连接", message, "连接成功");
}
ioobj.IO.Clear();
ioobj.IO.Close();
}
catch (Exception)
{
RecList("失败", "", "发送命令或接收数据异常!");
}
}
连接成功后就可以通过 ioobj.WriteString()和ioobj.ReadString()方法进行读写数据。也可以把这个方法放在类里边,这样声明了类的对象,就是可以多次重复使用。
总结
初次发表,感谢大家。如果大家有问题可以多交流。