当前位置:编程学习 > C#/ASP.NET >>

c#串口LED问题,急急急急急急,求大家帮帮忙

请大家帮忙下,我想完成如下图操作,FORM窗体上全是按钮控件,我想点击红色的按钮,然后再点击别的那些小按钮,它的颜色也会变为红色,如果点击绿色的按钮,再点击下面的小按钮中的随便一个它也会变成绿色。这个操作是要和电路板结合一起的,要让LED亮,所以要规定应用到串口,要根据界面的操作同时也改变电路板LED的操作。谢谢各位了,帮下忙。最好详细点,求助详细代码。谢谢了啊!!!
0x00是开启 0xFF是关闭
电路板上有两个LED等,红色,绿色,另外,还有个黄色的灯是红色和绿色一起亮才产生黄色的。请大家都过来帮帮忙啊,小女子不胜感激!!求代码详解啊。。。最好是代码的例子
--------------------编程问答-------------------- 用C#的 SeriaPort类  --------------------编程问答-------------------- --------------------编程问答--------------------
引用 1 楼 chenkui2008 的回复:
用C#的 SeriaPort类

我知道啊,但是具体怎么用呢? --------------------编程问答-------------------- 参考msdn的例子,创建连接,然后向串口发送命令,串口接收就行了 --------------------编程问答--------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO.Ports;

/// <summary>
/// Summary description for Protocol
/// </summary>
public class Protocol
{
public SerialPort serialPort = null;
public bool ReceiveEventFlag = false;  //接收事件是否有效 false表示有效

public event PortDataReceivedEventHandle Received;
public delegate void PortDataReceivedEventHandle(object sender, PortDataReciveEventArgs e);

public class PortDataReciveEventArgs : EventArgs
{
private byte[] data;

public byte[] Data
{
get { return data; }
set { data = value; }
}

public PortDataReciveEventArgs()
{
this.data = null;
}

public PortDataReciveEventArgs(byte[] data)
{
this.data = data;
}
//private string data;

//public string Data
//{
//    get { return data; }
//    set { data = value; }
//}
//public PortDataReciveEventArgs(string data)
//{
//    this.data = data;
//}

}

public Protocol(string sPortName, int iBaudRate, int iDataBits)
{
serialPort = new SerialPort();
serialPort.PortName = sPortName;   //通讯端口
serialPort.BaudRate = iBaudRate;   //波特率
serialPort.Parity = Parity.None;   //获取或设置奇偶校验检查协议
serialPort.DataBits = iDataBits;   //获取或设置每个字节的标准数据位长度。
serialPort.StopBits = StopBits.One;//获取或设置每个字节的标准停止位数。
serialPort.Handshake = Handshake.None;//获取或设置串行端口数据传输的握手协议。
serialPort.RtsEnable = true;       //获取或设置一个值,该值指示在串行通信中是否启用请求发送 (RTS) 信号。
serialPort.ReadTimeout = 2000;     //获取或设置读取操作未完成时发生超时之前的毫秒数。
serialPort.Open();
serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
}

/// <summary>
/// 释放串口资源
/// </summary>
~Protocol()
{
Close();
}

/// <summary>
/// 打开串口
/// </summary>
public void Open()
{
try
{
if (!serialPort.IsOpen)
{
serialPort.Open();
}
}
catch (Exception ex)
{
throw ex;
}
}

/// <summary>
/// 关闭串口
/// </summary>
public void Close()
{
if (serialPort.IsOpen)
{
serialPort.Close();
}
}

/// <summary>
/// 串口是否打开
/// </summary>
/// <returns></returns>
public bool IsOpen()
{
return serialPort.IsOpen;
}



/// <summary>
/// 数据发送
/// </summary>
/// <param name="data">要发送的数据字节</param>
public void SendData(byte[] data)
{
try
{
serialPort.DiscardInBuffer();
serialPort.Write(data, 0, data.Length);
}
catch (Exception ex)
{
throw ex;
}
}

/// <summary>
/// 发送命令
/// </summary>
/// <param name="SendData">发送数据</param>
/// <param name="ReceiveData">接收数据</param>
/// <param name="Overtime">超时时间</param>
/// <returns></returns>
public void SendCommand(byte[] SendData, ref string ReturnData, int Overtime)
{
if (serialPort.IsOpen)
{
try
{
ReceiveEventFlag = true;        //关闭接收事件
serialPort.DiscardInBuffer();   //清空接收缓冲区                 
serialPort.Write(SendData, 0, SendData.Length);
System.Threading.Thread.Sleep(500);

ReturnData = serialPort.ReadExisting();
//int num = 0, ret = 0;
//while (num++ < Overtime)
//{
//    if (serialPort.BytesToRead >= ReceiveData.Length)
//    {
//        break;
//    }
//    System.Threading.Thread.Sleep(50);
//}
//if (serialPort.BytesToRead >= ReceiveData.Length)
//{
//    ret = serialPort.Read(ReceiveData, 0, ReceiveData.Length);
//}
//else
//{
//    ret = serialPort.Read(ReceiveData, 0, serialPort.BytesToRead);
//}
ReceiveEventFlag = true;       //打开事件
//return ret;
}
catch (Exception ex)
{
ReceiveEventFlag = false;
throw ex;
}
}
//return -1;
}

///<summary>
///数据发送
///</summary>
///<param name="data">要发送的数据字符串</param>
public void SendData(string data)
{
//禁止接收事件时直接退出
if (ReceiveEventFlag)
{
return;
}
if (serialPort.IsOpen)
{
serialPort.Write(data);
}
}

///<summary>
///将指定数量的字节写入输出缓冲区中的指定偏移量处。
///</summary>
///<param name="data">发送的字节数据</param>
///<param name="offset">写入偏移量</param>
///<param name="count">写入的字节数</param>
public void SendData(byte[] data, int offset, int count)
{
//禁止接收事件时直接退出
if (ReceiveEventFlag)
{
return;
}
if (serialPort.IsOpen)
{
serialPort.Write(data, offset, count);
}
}


/// <summary>
/// 数据接收
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//禁止接收事件时直接退出
if (ReceiveEventFlag)
{
return;
}
try
{
byte[] data = new byte[serialPort.BytesToRead];
serialPort.Read(data, 0, data.Length);
//string data = serialPort.ReadExisting();
//RecevieData(data);
if (Received != null)
{
Received(sender, new PortDataReciveEventArgs(data));
}
}
catch (Exception ex)
{
throw ex;
}

}
}
--------------------编程问答-------------------- 谢谢5楼的信息哈,但是你那个是串口发送和接收的代码,我的是串口控制LED灯的关闭与开启的。还有要调节灯的颜色的,请问这个怎么弄啊 --------------------编程问答-------------------- 图片的描述是这样的:有三个按钮,分别为红色,绿色,黄色。然后还有一些小按钮,点击红色,然后再点击随便一个小按钮,它的(小按钮)颜色就会改变。点击绿色也是如此 --------------------编程问答--------------------
引用 5 楼 chenkui2008 的回复:
C# code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO.Ports;

/// <summary>
/// Summary description for Protocol
/// </summary>
public ……

ding --------------------编程问答--------------------
引用 6 楼 hslzl123 的回复:
谢谢5楼的信息哈,但是你那个是串口发送和接收的代码,我的是串口控制的。还有要调节灯的颜色的,请问这个怎么弄啊

你说要控制LED灯的关闭与开启,其实就是要通过串口发送命令 --------------------编程问答--------------------
引用 9 楼 jhdxhj 的回复:
你说要控制LED灯的关闭与开启,其实就是要通过串口发送命令

我想用一个数组发送一组数据给LED灯,但是在亮黄灯的时候,要两组数据一起发送的,这怎么弄?怎么让它两组数据一起发送给LED?比如说:byte[] sendchar2 = { 0x00 };(红灯开启),byte[] sendchar3 = { 0xff };(绿灯开启),黄灯的话就要两个一齐发送,怎么弄的?求代码详解 --------------------编程问答-------------------- 参考msdn的例子,创建连接,然后向串口发送命令,串口接收就行了 --------------------编程问答-------------------- 比如:你发第一个命令的时候,通过DataReceived事件判断是否发送完毕,如果发送完毕,在发送第2个命令,相当于发了2次命令,或者使用线程,同步操作! --------------------编程问答--------------------
引用 12 楼 chenkui2008 的回复:
比如:你发第一个命令的时候,通过DataReceived事件判断是否发送完毕,如果发送完毕,在发送第2个命令,相当于发了2次命令,或者使用线程,同步操作!

哦~~这样啊,谢谢你啊。我还是新手,什么都不懂,你发的代码是Web的,有没有FORM的啊? --------------------编程问答-------------------- 这个以前做过,
主要是你的电路板和你的COM口之间要使用相同的通信协议
比如你发0x00
电路板收到这个信号就要做某个动作,这个是你电路板里的程序决定的,嵌入开发就不是我们的专长了。
我上次是另一个部门的同事做的电路板 --------------------编程问答-------------------- Form的一样用啊,感觉Form的使用控制更简单,方法一样的,你Form里面可以用线程了,比操作web简单多了 --------------------编程问答-------------------- 我没做过from的,但是感觉form控制比web简单 嘿嘿 --------------------编程问答--------------------
引用 16 楼 chenkui2008 的回复:
我没做过from的,但是感觉form控制比web简单 嘿嘿

太感谢你了,请问你有飞信吗?我的飞信号是314768315,加我吧 --------------------编程问答--------------------
引用 14 楼 l13873666736 的回复:
这个以前做过,
主要是你的电路板和你的COM口之间要使用相同的通信协议
比如你发0x00
电路板收到这个信号就要做某个动作,这个是你电路板里的程序决定的,嵌入开发就不是我们的专长了。
我上次是另一个部门的同事做的电路板

那你有这个方面的实例吗? --------------------编程问答-------------------- 我曾经也做过灯饰方面的单片机通讯控制程序,可惜我现在没有源码了,以前也是用vb开发的,C#有什么问题我还是可以帮得到你的,你说的这个问题其实是很简单的一个控制 --------------------编程问答-------------------- 没飞信,美女发QQ吧 --------------------编程问答--------------------
引用 20 楼 chenkui2008 的回复:
没飞信,美女发QQ吧

17111056 --------------------编程问答-------------------- 只做过调C++ dll控件设备,向rfid读卡设备发指令,然后设备响应再回应,从回应信息中取数据。 --------------------编程问答--------------------
引用 22 楼 wangchangming 的回复:
只做过调C++ dll控件设备,向rfid读卡设备发指令,然后设备响应再回应,从回应信息中取数据。

哦~~好多人都学c++哦,但是从来都没学过。。哎。。 --------------------编程问答--------------------
引用 20 楼 chenkui2008 的回复:
没飞信,美女发QQ吧

人呢?????? --------------------编程问答-------------------- --------------------编程问答--------------------
引用 18 楼 hslzl123 的回复:
引用 14 楼 l13873666736 的回复:
这个以前做过,
主要是你的电路板和你的COM口之间要使用相同的通信协议
比如你发0x00
电路板收到这个信号就要做某个动作,这个是你电路板里的程序决定的,嵌入开发就不是我们的专长了。
我上次是另一个部门的同事做的电路板

那你有这个方面的实例吗?

控制端其实很容易,对我们而言,单片机的开发才是难点。只要跟单片机事先订好发0X00单片机就干嘛,就好了。关键是你要和单片机的开发人员沟通好。 --------------------编程问答-------------------- mark人
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,