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

C#中如何使用SerialPort控件向单片机发送数据?(C#做的是一个基于Visual C++的Windows窗体应用程序)
问题一:C#中如何使用SerialPort控件?比如我要达到这样的效果:点击界面上的一个按纽,点击时发生的事件是将本界面上的一些数据传送到单片机。
问题二:界面上的数字是十进制的,单片机需要的是十六进制的,怎么处理?
非常需要您的指点,最好能有类似的实例,非常感谢!
我的信箱GEJIZHE@163.COM
QQ:413054244

串口主要有以下几个参数:
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 /// <summary>
19 /// Window1.xaml 的交互逻辑
20 /// </summary>
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
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-12-20
你如果只是一个字符可以这样:
byte bt[0] = Convert.ToByte(你输入的字符串, 16);//注:此处字符串是单字节的
int n = Convert.ToInt32(你输入的字符串, 16);//如你需要的是数值型的
若字符串不是单字节的,可以转换成数组如下:
for(int i=0;i<str.Length/2;i=i+2)
{
byte[i]=Convert.ToByte(str.Substring(i*2, 2), 16);
}

参考资料:http://zhidao.baidu.com/question/147554728

第2个回答  2010-12-20
其实很简单,设置几个参数即可,下面是我写的从串口读取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());
}

}
}
第3个回答  2010-12-24
给我个邮箱,我发给你本书,很详细。
相似回答