串口代码:
//实例化一个串行端口
private SerialPort ComDe = new SerialPort();
public Form1()
{
InitializeComponent();
this.init();
}
//获取串口号的端口
public void init()
{
btnSend.Enabled = false;
//端口获取串口资源
cbbComList.Items.AddRange(SerialPort.GetPortNames());
//判断端口是否有串口
if (cbbComList.Items.Count>0)
{
cbbComList.SelectedIndex = 0;
}
//波特率
cbbBaudRate.SelectedIndex = 5;
//数据位
cbbDataBits.SelectedIndex = 0;
//校验位
cbbParity.SelectedIndex = 0;
//停止位
cbbStopBits.SelectedIndex = 0;
pictureBox1.BackgroundImage = Properties.Resources.red;
//绑定事件(接收指示已通过由 System.IO.Ports.SerialPort 对象表示的端口接收了数据)
ComDe.DataReceived += new SerialDataReceivedEventHandler(Com_DataReceived);
}
/// <summary>
/// 打开串口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOpen_Click(object sender, EventArgs e)
{
if (cbbComList.Items.Count<=0)
{
MessageBox.Show("没有发现串口,请检查线路!");
return;
}
//判断串口对象是否打开
if (ComDe.IsOpen==false)
{
//通信端口名
ComDe.PortName = cbbComList.SelectedItem.ToString();
ComDe.BaudRate = Convert.ToInt32(cbbBaudRate.SelectedItem.ToString());
ComDe.Parity = (Parity)Convert.ToInt32(cbbParity.SelectedIndex.ToString());
ComDe.DataBits = Convert.ToInt32(cbbDataBits.SelectedItem.ToString());
ComDe.StopBits = (StopBits)Convert.ToInt32(cbbStopBits.SelectedItem.ToString());
try
{
//打开一个新的端口号连接
ComDe.Open();
btnSend.Enabled = true;
}
catch (Exception ex)
{
//没有新的端口,报错“错误”提示框
MessageBox.Show(ex.Message,"错误",MessageBoxButtons.OK,MessageBoxIcon.Error);
return;
}
//关闭 绿,打开 红
btnOpen.Text = "关闭串口";
pictureBox1.BackgroundImage = Properties.Resources.green;
}
else
{
try
{
ComDe.Close();
btnSend.Enabled = false;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
btnOpen.Text = "打开串口";
pictureBox1.BackgroundImage = Properties.Resources.red;
}
//打开串口后,端口下拉框就不能选择了
cbbComList.Enabled = !ComDe.IsOpen;
cbbBaudRate.Enabled = !ComDe.IsOpen;
cbbParity.Enabled = !ComDe.IsOpen;
cbbDataBits.Enabled = !ComDe.IsOpen;
cbbStopBits.Enabled = !ComDe.IsOpen;
}
/// <summary>
/// 发送数据
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public bool SendData(byte[] data)
{
//判断端口是否打开
if (ComDe.IsOpen)
{
try
{
//使用缓冲区中的数据将指定数量的字节写入串行端口。
ComDe.Write(data,0,data.Length);
return true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
//否则
else
{
MessageBox.Show("串口未打开", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
return false;
}
/// <summary>
/// 发送数据Button事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSend_Click(object sender, EventArgs e)
{
byte[] sendData = null;
if (rbtnSendHex.Checked)
{
sendData = strToHexByte(txtSendData.Text.Trim());
}
else if (rbtnSendASCII.Checked)
{
sendData = Encoding.ASCII.GetBytes(txtSendData.Text.Trim());
}
else if (rbtnSendUTF8.Checked)
{
sendData = Encoding.UTF8.GetBytes(txtSendData.Text.Trim());
}
else if (rbtnSendUnicode.Checked)
{
sendData = Encoding.Unicode.GetBytes(txtSendData.Text.Trim());
}
else
{
sendData = Encoding.ASCII.GetBytes(txtSendData.Text.Trim());
}
//发送数据成功计数
if (this.SendData(sendData))
{
lblSendCount.Invoke(new MethodInvoker(delegate
{
lblSendCount.Text = (int.Parse(lblSendCount.Text) + txtSendData.Text.Length).ToString();
}));
}
else
{
}
}
/// <summary>
/// 字符串转换16进制字节数组
/// </summary>
/// <param name="hexString"></param>
/// <returns></returns>
private byte[] strToHexByte(string hexString)
{
//将多余的空格" "用""代替
hexString = hexString.Replace(" ", "");
//判断发送的字符中是否有多余的数
if ((hexString.Length % 2) != 0)
{
hexString += "";
}
byte[] returnBytes = new byte[hexString.Length / 2];
for (int i = 0; i < returnBytes.Length; i++)
{
returnBytes[i] = Convert.ToByte(hexString.Substring(i*2,2).Replace(" ",""),16);
}
return returnBytes;
}
/// <summary>
/// 接收数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Com_DataReceived(object sender,SerialDataReceivedEventArgs e)
{
Thread.Sleep(500);
//接收存储的数据
byte[] ReDatas = new byte[ComDe.BytesToRead];
//读取数据
ComDe.Read(ReDatas, 0, ReDatas.Length);
//输出数据
this.AddData(ReDatas);
}
/// <summary>
/// 添加数据
/// </summary>
/// <param name="data">字节数组</param>
public void AddData(byte[] data)
{
if (rbtnHex.Checked)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
sb.AppendFormat("{0:x2}" + " ", data[i]);
}
AddContent(sb.ToString().ToUpper());
}
else if (rbtnASCII.Checked)
{
AddContent(new ASCIIEncoding().GetString(data));
}
else if (rbtnUTF8.Checked)
{
AddContent(new UTF8Encoding().GetString(data));
}
else if (rbtnUnicode.Checked)
{
AddContent(new UnicodeEncoding().GetString(data));
}
}
/// <summary>
/// 输入到显示区域
/// </summary>
/// <param name="content"></param>
private void AddContent(string content)
{
ComDe.RtsEnable = true;
this.BeginInvoke(new MethodInvoker(delegate
{
if (chkAutoLine.Checked && txtShowData.Text.Length>0)
{
txtShowData.AppendText("\r\n");
}
txtShowData.AppendText(content);
//Photo();
}));
}
/// <summary>
/// 清空接收区
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnClearRev_Click(object sender, EventArgs e)
{
txtShowData.Clear();
}
/// <summary>
/// 清空发送区
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnClearSend_Click(object sender, EventArgs e)
{
txtSendData.Clear();
}
串口界面
下位机封装好程序了,只要在发送区发送a#*就可以控制灯的亮并且返回97这个数字在接收区
问题:
1.上位机给单片机发送数据,串口的d3就会亮一次,随之熄灭,单片机接收信号,但灯不亮,并且不返回97到接收区
2.我不用单片机,直接把数据线上的TX、RX短接,再用上位机发送数据,这时 上位机显示区就能显示上位机发送的数据;
大佬们,我想问怎么解决,不知道哪里出了问题
你单片机的线是不是哪里接的有问题?
线没有问题,波特率的事