目的是为了获得ADAM4017(模拟量)上的传感器数据
下图是在串口调试工具上的结果 发送指定的指令,接收一整串完整的值
下图是在winform实现的效果,接收的数据长度不对,而且断断续续的。通过打断点发现创建完接收字节数组后,
并没有读到目标长度的数据。
下面是程序代码
namespace SerialPortManager
{
public partial class Form1 : Form
{
SerialPort sp = new SerialPort();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
sp.PortName = "com6"; //设置串口号
sp.BaudRate = 9600;//设置波特率
wd_txt.Text = null;
Control.CheckForIllegalCrossThreadCalls = false; //这个类中我们不检查跨线程的调用是否合法(因为.net 2.0以后加强了安全机制,,不允许在winform中直接跨线程访问控件的属性)
sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
sp.Open();
}
private void btnSend_Click(object sender, EventArgs e)
{
if (!sp.IsOpen) //如果没打开
{
MessageBox.Show("请先打开串口!", "Error");
return;
}
//处理数字转换
string[] strArray = txtSend.Text.Trim().Split(' '); //将02 03 00 00 00 08 44 3F分割成8个分别存放
byte[] byteBuffer = new byte[strArray.Length]; //创建一个新的byte
for (int i = 0; i < strArray.Length; i++) //对获取的字符做相加运算
{
Byte[] bytesOfStr = Encoding.Default.GetBytes(strArray[i]);
int decNum = Convert.ToInt32(strArray[i], 16); //atrArray[i] == 12时,temp == 18
byteBuffer[i] = Convert.ToByte(decNum);
}
sp.Write(byteBuffer, 0, byteBuffer.Length);
}
void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (sp.IsOpen) //此处可能没有必要判断是否打开串口,但为了严谨性,我还是加上了
{
byte[] byteRead = new byte[sp.BytesToRead]; //BytesToRead:sp1接收的字符个数
{
Byte[] receivedData = new Byte[sp.BytesToRead]; //创建接收字节数组
sp.Read(receivedData, 0, receivedData.Length); //读取数据
sp.DiscardInBuffer(); //清空SerialPort控件的Buffer
string strRcv = null;
string a = null;
for (int i = 0; i < receivedData.Length; i++) //窗体显示
{
strRcv = strRcv + receivedData[i].ToString("X2"); //16进制显示
if (i == 1)
{
a = a + receivedData[i].ToString("X2");
}
}
wd_txt.Text = a;
txtReceive.Text += strRcv + "\r\n";
}
}
else
{
MessageBox.Show("请先打开串口");
}
}