C#中如何使用SerialPort控件向单片机发送数据?

2024-11-28 23:36:41
推荐回答(4个)
回答(1):

串口主要有以下几个参数:
1.串口名称(PortName)
2.波特率(BaudRate)
3.数据位(DataBits)
4.奇偶效应(Parity)
5.停止位(StopBits)

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Windows;
6 using System.Windows.Controls;
7 using System.Windows.Data;
8 using System.Windows.Documents;
9 using System.Windows.Input;
10 using System.Windows.Media;
11 using System.Windows.Media.Imaging;
12 using System.Windows.Navigation;
13 using System.Windows.Shapes;
14 using System.IO.Ports;
15
16 namespace CsharpComm
17 {
18 ///


19 /// Window1.xaml 的交互逻辑
20 ///

21 public partial class Window1 : Window
22 {
23 public Window1()
24 {
25 InitializeComponent();
26 }
27
28 //定义 SerialPort对象
29 SerialPort port1;
30
31 //初始化SerialPort对象方法.PortName为COM口名称,例如"COM1","COM2"等,注意是string类型
32 public void InitCOM(string PortName)
33 {
34 port1 = new SerialPort(PortName);
35 port1.BaudRate = 9600;//波特率
36 port1.Parity = Parity.None;//无奇偶校验位
37 port1.StopBits = StopBits.Two;//两个停止位
38 port1.Handshake = Handshake.RequestToSend;//控制协议
39 port1.ReceivedBytesThreshold = 4;//设置 DataReceived 事件发生前内部输入缓冲区中的字节数
40 port1.DataReceived += new SerialDataReceivedEventHandler(port1_DataReceived);//DataReceived事件委托
41 }
42
43 //DataReceived事件委托方法
44 private void port1_DataReceived(object sender, SerialDataReceivedEventArgs e)
45 {
46 try
47 {
48 StringBuilder currentline = new StringBuilder();
49 //循环接收数据
50 while (port1.BytesToRead > 0)
51 {
52 char ch = (char)port1.ReadByte();
53 currentline.Append(ch);
54 }
55 //在这里对接收到的数据进行处理
56 //
57 currentline = new StringBuilder();
58 }
59 catch(Exception ex)
60 {
61 Console.WriteLine(ex.Message.ToString());
62 }
63
64 }
65
66 //打开串口的方法
67 public void OpenPort()
68 {
69 try
70 {
71 port1.Open();
72 }
73 catch { }
74 if (port1.IsOpen)
75 {
76 Console.WriteLine("the port is opened!");
77 }
78 else
79 {
80 Console.WriteLine("failure to open the port!");
81 }
82 }
83
84 //关闭串口的方法
85 public void ClosePort()
86 {
87 port1.Close();
88 if (!port1.IsOpen)
89 {
90 Console.WriteLine("the port is already closed!");
91 }
92 }
93
94 //向串口发送数据
95 public void SendCommand(string CommandString)
96 {
97 byte[] WriteBuffer = Encoding.ASCII.GetBytes(CommandString);
98 port1.Write(WriteBuffer, 0, WriteBuffer.Length);
99 }
100
101 //调用实例
102 private void btnOpen_Click(object sender, RoutedEventArgs e)
103 {
104 //我现在用的COM1端口,按需要可改成COM2,COM3
105 InitCOM("COM1");
106 OpenPort();
107 }
108 }
109 }

最后推荐你再看一下这篇文章,应该会很有帮助
http://scorpiomiracle.javaeye.com/blog/653923

回答(2):

你如果只是一个字符可以这样:
byte bt[0] = Convert.ToByte(你输入的字符串, 16);//注:此处字符串是单字节的
int n = Convert.ToInt32(你输入的字符串, 16);//如你需要的是数值型的
若字符串不是单字节的,可以转换成数组如下:
for(int i=0;i{
byte[i]=Convert.ToByte(str.Substring(i*2, 2), 16);
}

回答(3):

其实很简单,设置几个参数即可,下面是我写的从串口读取DS18B20发回温度的例子。
namespace 串口通信
{
public partial class Form1 : Form
{
SerialPort sp=new SerialPort ("COM1");

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

sp.BaudRate = 9600;
sp.DataBits = 8;
sp.Parity = Parity.None;
sp.StopBits = StopBits.One;
sp.ReadTimeout = -1;
sp.Open();

timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
sp.DiscardInBuffer();
label1.Text = Convert.ToString(sp.ReadByte());
}

}
}

回答(4):

给我个邮箱,我发给你本书,很详细。