我用vs写了一个上位机,为了修改我的单片机的两个参数,现在遇到了一个问题就是,发送的命令格式对了,可是单片机没有回传应答数据,看不出来什么问题了,请教各位大牛们帮忙解决一下!
这是正常应该返回的单片机数据
这是我自己写的,如图,并没有数据返回
话不多说,直接上代码看
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
namespace 串口助手
{
public partial class 串口助手 : Form
{
public 串口助手()
{
InitializeComponent();
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;//设置该属性 为false
}
/* 新增自定义函数:更新可用串口 */
private void Updata_Serialport_Name(ComboBox MycomboBox)
{
string[] ArryPort; // 定义字符串数组,数组名为 ArryPort
ArryPort = SerialPort.GetPortNames(); // SerialPort.GetPortNames()函数功能为获取计算机所有可用串口,以字符串数组形式输出
MycomboBox.Items.Clear(); // 清除当前组合框下拉菜单内容
for (int i = 0; i < ArryPort.Length; i++)
{
MycomboBox.Items.Add(ArryPort[i]); // 将所有的可用串口号添加到端口对应的组合框中
}
}
private void 串口助手_Load(object sender, EventArgs e)
{
Updata_Serialport_Name(comboBoxPort);
}
private void timer1_Tick(object sender, EventArgs e)
{
Updata_Serialport_Name(comboBoxPort);// 定时刷新可用串口,可以保证在程序启动之后连接的设备也能被检测到
}
private void btnOpenSerialPort_Click(object sender, EventArgs e)
{
if (btnOpenSerialPort.Text == "打开串口") // 如果当前是串口设备是关闭状态
{
try
{
serialPort1.PortName = comboBoxPort.Text; // 将串口设备的串口号属性设置为comboBox1复选框中选择的串口号
serialPort1.BaudRate = Convert.ToInt32(comboBoxBaudRate.Text); // 将串口设备的波特率属性设置为comboBox2复选框中选择的波特率
serialPort1.Open(); // 打开串口,如果打开了继续向下执行,如果失败了,跳转至catch部分
comboBoxPort.Enabled = false; // 串口已打开,将comboBox1设置为不可操作
comboBoxBaudRate.Enabled = false; // 串口已打开,将comboBox2设置为不可操作
btnOpenSerialPort.BackColor = Color.Red; // 将串口开关按键的颜色,改为红色
btnOpenSerialPort.Text = "关闭串口"; // 将串口开关按键的文字改为“关闭串口”
}
catch
{
MessageBox.Show("打开串口失败,请检查串口", "错误"); // 弹出错误对话框
}
}
else // 如果当前串口设备是打开状态
{
try
{
serialPort1.Close(); // 关闭串口
comboBoxPort.Enabled = true; // 串口已关闭,将comboBox1设置为可操作
comboBoxBaudRate.Enabled = true; // 串口已关闭,将comboBox2设置为可操作
btnOpenSerialPort.BackColor = Color.Lime; // 将串口开关按键的颜色,改为青绿色
btnOpenSerialPort.Text = "打开串口"; // 将串口开关按键的文字改为“打开串口”
}
catch
{
MessageBox.Show("关闭串口失败,请检查串口", "错误"); // 弹出错误对话框
}
}
}
private void button2_Click(object sender, EventArgs e)
{
textBoxStatus.Text = "";
}
private void btnSendCommand_Click(object sender, EventArgs e)
{
if (serialPort1 != null && serialPort1.IsOpen)
{
// 获取NumericUpDown控件的值
int shakeTimesValue = (int)numericUpDownShakeTimes.Value;
int shakeDelayValue = (int)numericUpDownShakeDelay.Value;
// 将整数值转换为16进制字符串,并确保每个数字都是两位数
string hexShakeTimes = shakeTimesValue.ToString("X2");
string hexShakeDelay = shakeDelayValue.ToString("X2");
// 构建命令字符串,例如 "AA BB 07 01 64 C8 FF"
string commandStr = $"AA BB 07 01 {hexShakeTimes} {hexShakeDelay} FF";
// 将16进制字符串转换为字节数组
byte[] commandBytes =
{
0xAA, 0xBB, 0x07, 0x01,
Convert.ToByte(hexShakeTimes, 16),
Convert.ToByte(hexShakeDelay, 16),
0xFF
};
try
{
// 发送命令
serialPort1.Write(commandBytes, 0, commandBytes.Length);
textBoxStatus.AppendText($"发送的命令:{commandStr}\r\n");
}
catch (Exception ex)
{
textBoxStatus.AppendText($"发送命令失败:{ex.Message}\r\n");
}
}
else
{
MessageBox.Show("串口未打开,请先打开串口。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
// 读取接收到的数据
byte[] buffer = new byte[serialPort1.BytesToRead];
serialPort1.Read(buffer, 0, buffer.Length);
// 尝试以ASCII编码方式显示数据
//string asciiString = Encoding.ASCII.GetString(buffer);
//textBoxStatus.AppendText(asciiString);
// 如果ASCII显示为乱码,尝试以UTF-8编码方式显示数据
// string utf8String = Encoding.UTF8.GetString(buffer);
//textBoxStatus.AppendText(utf8String);
// 如果数据是16进制,可以这样显示
string hexString = BitConverter.ToString(buffer).Replace("-", " ");
textBoxStatus.AppendText($"接收到的数据:{hexString}\r\n");
}
catch (Exception ex)
{
textBoxStatus.AppendText($"接收数据时发生错误: {ex.Message}\r\n");
}
}
}
}
这是我串口的属性
希望能看出问题的哥们帮忙指正一下,好人一生平安!
更多回帖