C#中对串口的操作
1、通过new SerialPort()创建串口对象
public static SerialPort sp1 = new SerialPort();/*sp1为创建的串口对象名*/
2、通过MulGetHardwareInfo()查找当前的串口
串口设备在Windows下的命名规则如下;我们可以在C#面板上创建一个ComboBox控件用于对当前电脑所接串口设备的显示("COMx"的显示格式)及选择交互。
int StartIndex = 0;
int EndIndex = 0;
string[] ss = MulGetHardwareInfo(HardwareEnum.Win32_PnPEntity, "Name");/*获取当前电脑上的串口设备名*/
cbSerial.Items.Clear(); /*cbSerial即上面描述的ComboBox控件对象名;进行Item清除*/
for (i = 0; i < ss.Length; i++)
{
if (ss[i].Contains("(COM"))
{
StartIndex = ss[i].LastIndexOf("COM");
EndIndex = ss[i].LastIndexOf(")");
cbSerial.Items.Add(ss[i].Substring(StartIndex, (EndIndex - StartIndex)));
}
}
3、对串口对象(例子中的sp1)的其他属性进行配置
对于串口,一般我们还需对其波特率,数据位、停止位、校验位等信息进行配置。同样,我们可以在面板上新建ComboBox对象用于交互。ComboBox对象的选项(如代码中cbParity的"无"、“奇校验”、“偶校验”等选项)可在该ComboBox控件的Item属性中设置。控件如下:
sp1.BaudRate = iBaudRate; /*波特率设置*/
sp1.DataBits = iDateBits; /*数据位设置*/
switch (cbStop.Text)
{
case "1":
sp1.StopBits = StopBits.One; /*停止位设置*/
break;
case "1.5":
sp1.StopBits = StopBits.OnePointFive;
break;
case "2":
sp1.StopBits = StopBits.Two;
break;
default:
MessageBox.Show("Error:参数不正确!", "Error");
break;
}
switch (cbParity.Text)
{
case "无":
sp1.Parity = Parity.None; /*校验位设置*/
break;
case "奇校验":
sp1.Parity = Parity.Odd;
break;
case "偶校验":
sp1.Parity = Parity.Even;
break;
default:
MessageBox.Show("Error:参数不正确!", "Error");
break;
}
4、弹出文件选择框,进行文件类型筛选;
OpenFileDialog open = new OpenFileDialog();
open.Filter = "(bin文件)|*.bin"; /*设置筛选的是bin格式的文件*/
if (open.ShowDialog() == DialogResult.OK) /*判断是否已经进行了文件选择*/
{
/*对选择的文件的操作;文件路径名由open.FileName表示*/
}
5、通过FileStream类打开前面选择的文件,获取数据
/*通过FileInfo类获取文件的长度信息*/
FileInfo fi = new FileInfo(open.FileName);
long len = fi.Length;
/*通过FileStream类对文件进行数据读取*/
FileStream fs = new FileStream(open.FileName, FileMode.Open);
byte[] buffer = new byte[len];
fs.Read(buffer, 0, (int)len);
fs.Close();
对于Bin文件的读取,也可以通过BinaryReader来进行;如下:
ArrayList binArraylist = new ArrayList();
byte ByteOfRead;
/*声明文件流*/
FileStream fs = new FileStream(open.FileName, FileMode.Open, FileAccess.Read);
/*创建读取器*/
BinaryReader brReader = new BinaryReader(fs);
while (brReader.BaseStream.Position < brReader.BaseStream.Length)/*文件未读完*/
{
ByteOfRead = brReader.ReadByte();/*读取文件一个字节的数据,添加到binArraylist中去*/
binArraylist.Add(ByteOfRead);
}
brReader.Close();
6、从串口缓冲区取数据
if (sp1.IsOpen) /*判断串口属于打开的状态*/
{
int LengthOfBuffer;
if(False == sp1.IsOpen) /*在对串口进行操作(sp1.方法)前的检查;防止关闭串口造成的死机*/
{
break;
}
LengthOfBuffer = SerialPortConnection.Form1.sp1.BytesToRead; /*获取当前串口缓冲区的字节数*/
byte[] Recvbuff = new byte[LengthOfBuffer];
SerialPortConnection.Form1.sp1.Read(Recvbuff, offset, LengthOfBuffer); /*从串口缓冲区读取LengthOfBuffer个字节,存放到Recvbuff[offset]的起始位置*/
}
此外,也可以一个字节一个字节读取(通过返回值获取数据):
SerialPortConnection.Form1.sp1.ReadByte();
也可以一次读出当前缓冲区中的数据(通过返回值获取数据) :
SerialPortConnection.Form1.sp1.ReadExisting();
7、往串口缓冲区中写数据
sp1.Write(Source, Offset, Length); /*从Source[Offset] 处开始,取count个字节数据写入到串行端口*/