界面的问题设计串口通信

haiyangshishui 2012-04-21 05:42:01
假如我现在按下按键,我按键的后台程序,会自动发送一个我已经定义好的数组例如:ff,01,ff,ff,ff,ff,01,03,05。这些数据要通过串口发送出去,应如何实现?求助啊
...全文
194 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
haiyangshishui 2012-07-10
  • 打赏
  • 举报
回复
结贴了,
haiyangshishui 2012-04-21
  • 打赏
  • 举报
回复
恩,是的,非常正确,是十六进制的一个数据包,
orochiheart 2012-04-21
  • 打赏
  • 举报
回复
ff,01,ff,ff,ff,ff,01,03,05

你这个数据,我猜一下,如果说错了请当我没说

你这个应该是16进制 将每个数转换成byte 然后组团发送。。。
orochiheart 2012-04-21
  • 打赏
  • 举报
回复

/// <summary>
///发送一个数据
/// </summary>
/// <param name="COM">"COM1"</param>
/// <param name="BaudRate">9600</param>
/// <param name="Data">"123"tobyte[]</param>
/// <param name="Encoding">ASCII</param>
public static byte[] SerialPort(string p_COM, int p_BaudRate, byte[] p_Data, Encoding p_Encoding)
{
SerialPort _SendPort = new SerialPort();
_SendPort.PortName = p_COM;
_SendPort.BaudRate = p_BaudRate;
_SendPort.DataBits = 8;
_SendPort.Parity = Parity.None;
_SendPort.StopBits = StopBits.One;
_SendPort.DtrEnable = true;
_SendPort.DtrEnable = true;
_SendPort.Encoding = p_Encoding;

if (_SendPort.IsOpen)
{
_SendPort.Close();
_SendPort.Open();
}
else
{
_SendPort.Open();
_SendPort.Write(p_Data, 0, p_Data.Length);
byte[] refData = new byte[_SendPort.BytesToRead];
for (int i = 0; i != p_Data.Length; i++)
{
refData[i] = Convert.ToByte(_SendPort.ReadByte());
}
return refData;
}

return null;

}

我觉得这个不错 一目了然->http://wenku.baidu.com/view/ae9f3ecaa1c7aa00b52acbe3.html

好吧,再给个Demo地址->http://download.csdn.net/detail/mendern/2425658

深入学习,参考:
http://topic.csdn.net/u/20080623/08/4bbd2475-45f1-42e3-a613-16b094759ade.html?31411
http://topic.csdn.net/u/20080619/08/dcef3fe2-f95b-4918-8edb-36d48a3d0528.html?15470
haiyangshishui 2012-04-21
  • 打赏
  • 举报
回复
我这里写的串口通信程序(一) 这个串口通信程序,测试了只能够自发自收,假如我用单片机发数据就收不到了,?问:这个只是适合自发自收吗?
SerialPort sp = new SerialPort();
private void btn1_Click(object sender, EventArgs e)
{
sp.PortName = "COM3";
sp.BaudRate = 9600;
sp.Open();
byte[] data = Encoding.Unicode.GetBytes(re.Text);
string str = Convert.ToBase64String(data);
sp.WriteLine(str);
MessageBox.Show("数据发送成功", "系统提示");
}

private void btn2_Click(object sender, EventArgs e)
{
byte[] data = Convert.FromBase64String(sp.ReadLine());
tr.Text = Encoding.Unicode.GetString(data);
sp.Close();
MessageBox.Show("数据接收成功", "系统提示");


(二)这个是用事件触发的,但是用单片机发数据在revtext.Text上接受不到,问?为什么?
}
System.IO.Ports.SerialDataReceivedEventArgs 将导致该该事件被触发;

private void mycomm_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
int DataLength = mycomm.BytesToRead;//获取接受缓冲区中数据的字节数
int i = 0;
StringBuilder strb = new StringBuilder();
while (i < DataLength)
{
byte[] dbs = new byte[2048];
int len = mycomm.Read(dbs,0,2048);//每次从输入缓冲区中读取2048个字节,并将这些字节写入到dbs[]数组中
strb.Append(ASCIIEncoding.GetEncoding("gb2312").GetString(dbs, 0, len));
i += len;
}
revtext.Text += strb;// revtext.Text 将显示接收到的数据
}

(三)这个与上面类似,用单片机可以实现发数据,在界面上接收,但是收到的是乱码?问:为什么?
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{ int DataLength = serialPort1.BytesToRead;
int i = 0;
StringBuilder strb = new StringBuilder();
while(i<DataLength )
{
byte[] dbs = new byte[14];
int len = serialPort1.Read(dbs, 0, 14);

RevAppend(ASCIIEncoding.GetEncoding("gb2312").GetString(dbs, 0, len));
i += len;
}

void RevAppend(string str)
{
if (textBox1.InvokeRequired)
this.Invoke(new MethodInvoker(delegate
{
textBox1.AppendText(str); ;
textBox1.SelectionStart = int.MaxValue;
textBox1.SelectionLength = 1;
textBox1.ScrollToCaret();
}));
else
{
textBox1.AppendText(str);
textBox1.SelectionStart = int.MaxValue;
textBox1.SelectionLength = 1;
textBox1.ScrollToCaret();
}
}

这些是我写的,可是出现的问题,我上面都写了,希望你们帮忙看看
haiyangshishui 2012-04-21
  • 打赏
  • 举报
回复
这个我会,我现在是发送的代码已经写在我所需的按键后台程序里面,我一按键,程序就发出去啊....
mizuho_2006 2012-04-21
  • 打赏
  • 举报
回复
用C#的SerialPort类

具体串口通信的例子网上很多的!
LOVE_GG 2012-04-21
  • 打赏
  • 举报
回复

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧