![]()
|
名 称 | 说 明 |
BaseStream | 获取 SerialPort 对象的基础 Stream 对象 |
BaudRate | 获取或设置串行波特率 |
BreakState | 获取或设置中断信号状态 |
BytesToRead | 获取接收缓冲区中数据的字节数 |
BytesToWrite | 获取发送缓冲区中数据的字节数 |
CDHolding | 获取端口的载波检测行的状态 |
CtsHolding | 获取“可以发送”行的状态 |
DataBits | 获取或设置每个字节的标准数据位长度 |
DiscardNull | 获取或设置一个值,该值指示 Null 字节在端口和接收缓冲区之间传输时是否被忽略 |
DsrHolding | 获取数据设置就绪 (DSR) 信号的状态 |
DtrEnable | 获取或设置一个值,该值在串行通信过程中启用数据终端就绪 (DTR) 信号 |
Encoding | 获取或设置传输前后文本转换的字节编码 |
Handshake | 获取或设置串行端口数据传输的握手协议 |
IsOpen | 获取一个值,该值指示 SerialPort 对象的打开或关闭状态 |
NewLine | 获取或设置用于解释 ReadLine( )和WriteLine( )方法调用结束的值 |
Parity | 获取或设置奇偶校验检查协议 |
续表
名 称 | 说 明 |
ParityReplace | 获取或设置一个字节,该字节在发生奇偶校验错误时替换数据流中的无效字节 |
PortName | 获取或设置通信端口,包括但不限于所有可用的 COM 端口 |
ReadBufferSize | 获取或设置 SerialPort 输入缓冲区的大小 |
ReadTimeout | 获取或设置读取操作未完成时发生超时之前的毫秒数 |
ReceivedBytesThreshold | 获取或设置 DataReceived 事件发生前内部输入缓冲区中的字节数 |
RtsEnable | 获取或设置一个值,该值指示在串行通信中是否启用请求发送 (RTS) 信号 |
StopBits | 获取或设置每个字节的标准停止位数 |
WriteBufferSize | 获取或设置串行端口输出缓冲区的大小 |
WriteTimeout | 获取或设置写入操作未完成时发生超时之前的毫秒数 |
表13.2 SerialPort类的常用方法
方 法 名 称 | 说 明 |
Close | 关闭端口连接,将 IsOpen 属性设置为False,并释放内部 Stream 对象 |
Open | 打开一个新的串行端口连接 |
Read | 从 SerialPort 输入缓冲区中读取 |
ReadByte | 从 SerialPort 输入缓冲区中同步读取一个字节 |
ReadChar | 从 SerialPort 输入缓冲区中同步读取一个字符 |
ReadLine | 一直读取到输入缓冲区中的 NewLine 值 |
ReadTo | 一直读取到输入缓冲区中指定 value 的字符串 |
Write | 已重载。将数据写入串行端口输出缓冲区 |
WriteLine | 将指定的字符串和 NewLine 值写入输出缓冲区 |
如果没有用跳线连接下面的,程序运行出错!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
注意:用跳线使串口的第2、3针连接,可以在本地计算机上实现串口通信,所以,通过串口的第2、3针的连接可以对程序进行检测。串口截面图如图13.2所示。
图13.2 串口截面图
实现过程![](https://i-blog.csdnimg.cn/blog_migrate/4a636a02e1973d48a8e792ec2449e0a6.png)
(1)新建一个项目,命名为Ex13_01,默认窗体为Form1。
(2)在Form1窗体中,主要添加两个Button控件,分别用于执行发送数据和接受数据,添加两个TextBox控件,用于输入发送数据和显示接收数据。
(3)主要程序代码。
private void button1_Click(object sender, EventArgs e)
{
serialPort1.PortName = "COM1";
serialPort1.BaudRate = 9600;
serialPort1.Open();
byte[] data = Encoding.Unicode.GetBytes(textBox1.Text);
string str = Convert.ToBase64String(data);
serialPort1.WriteLine(str);
MessageBox.Show("数据发送成功!","系统提示");
}
private void button2_Click(object sender, EventArgs e)
{
byte[] data = Convert.FromBase64String(serialPort1.ReadLine());
textBox2.Text = Encoding.Unicode.GetString(data);
serialPort1.Close();
MessageBox.Show("数据接收成功!","系统提示");
}
举一反三![](https://i-blog.csdnimg.cn/blog_migrate/4a636a02e1973d48a8e792ec2449e0a6.png)
根据本实例,读者可以实现以下功能。
远程监控对方计算机屏幕。
下位机控制程序。
实例419 通过串口关闭对方计算机
实例说明![](https://i-blog.csdnimg.cn/blog_migrate/4a636a02e1973d48a8e792ec2449e0a6.png)
在网络应用程序中,主要通过网卡实现数据的传输,因此可以利用套接字技术实现远程关闭计算机。如果计算机中没有安装网卡,该如何实现远程关闭计算机呢?本例实现了利用串口关闭对方计算机,程序运行结果如图13.3所示。
技术要点![](https://i-blog.csdnimg.cn/blog_migrate/4a636a02e1973d48a8e792ec2449e0a6.png)
本实例使用SerialPort类的属性和方法,请参见实例“通过串口发送数据”。下面主要介绍SerialPort类的DataReceived 事件,DataReceived 事件为本实例的主要使用技术。DataReceived事件表示将处理 SerialPort 对象的数据接收事件的方法。串行接收事件可以由 SerialData 枚举中的任何项引起,是否引发此事件由操作系统决定,所以不一定会报告所有奇偶校验错误。
注意:本实例从开发到测试,都是由本地计算机完成的,用户只需要使用跳线将串口的第2、3针连接,可以在本地计算机上实现串口通信。跳线连接请参见图13.2。
实现过程![](https://i-blog.csdnimg.cn/blog_migrate/4a636a02e1973d48a8e792ec2449e0a6.png)
(1)新建一个项目,命名为Ex13_02,默认窗体为Form1。
(2)在Form1窗体中,主要添加两个Button控件,分别用于打开通信串口和关闭对方计算机。
(3)主要程序代码。
private void button1_Click(object sender, EventArgs e)
{
//打开串口
serialPort1.PortName = "COM1";
serialPort1.Open();
button1.Enabled = false;
button2.Enabled = true;
} //数据接收事件,等待接收关机命令
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] data = Convert.FromBase64String(serialPort1.ReadLine());
string str = Encoding.Unicode.GetString(data);
serialPort1.Close();
if (str == "关机")
{
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.Start();
p.StandardInput.WriteLine("shutdown /s");
p.StandardInput.WriteLine("exit");
}
} //发送关机命令
private void button2_Click(object sender, EventArgs e)
{
if (button2.Text == "关闭计算机")
{
//发送关机命令数据
byte[] data = Encoding.Unicode.GetBytes("关机");
string str = Convert.ToBase64String(data);
serialPort1.WriteLine(str);
button2.Text = "取消关机";
}
else
{
button2.Text = "关闭计算机";
button1.Enabled = true;
button2.Enabled = false;
//取消关机
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.Start();
p.StandardInput.WriteLine("shutdown /a");
p.StandardInput.WriteLine("exit");
}
}
在我的测试软件中发现一个问题,就是当发送数据小于或等于8位时,一切正常,如果大于8为字节,则在datareceived事件中接收到的数据会分成两段,第一段为8位,第二段为剩下的字节,很奇怪,在msdn中讲到不能保证每次发送的数据都能正确接收到,需要参照BytesToRead属性来确定要读取的数据量,所以我想出来的解决办法为:
int DataLength=serialPort.BytesToRead;
int i=0;
StringBuilder sb=new StringBuilder();
while(i<DataLength)
{
byte[] ds=new byte[1024];
int len=serialPort.Read(ds,0,1024);
sb.Append(Encoding.Ascii.GetString(ds,0,len));
i+=len;
}
Console.Write(sb,ToString());
这种奇怪的方法可以解决问题,后来想想应该是串口的工作方式决定的也有可能,期待其他的解决方式。
来自:http://hi.baidu.com/jackeyrain/blog/item/f4e3ef1fa3272fcea68669c6.html