需求
我們?cè)谄綍r(shí)使用單片機(jī)制作項(xiàng)目時(shí),總是希望能夠?qū)崟r(shí)顯示一些數(shù)據(jù),并將這些數(shù)據(jù)進(jìn)行處理,從而進(jìn)行使用。那么上位機(jī)就必不可少了。上位機(jī)是指可以直接發(fā)出操控命令的計(jì)算機(jī),一般是PC屏幕上顯示各種信號(hào)變化。下位機(jī)是直接控制設(shè)備獲取設(shè)備狀況的計(jì)算機(jī),一般是單片機(jī)之類的。上位機(jī)發(fā)出的命令首先給下位機(jī),下位機(jī)再根據(jù)此命令解釋成相應(yīng)時(shí)序信號(hào)直接控制相應(yīng)設(shè)備。下位機(jī)不時(shí)讀取設(shè)備狀態(tài)數(shù)據(jù)(一般為模擬量),轉(zhuǎn)換成數(shù)字信號(hào)反饋給上位機(jī)。簡(jiǎn)言之如此,實(shí)際情況千差萬(wàn)別,但萬(wàn)變不離其宗:上下位機(jī)都需要編程,都有專門(mén)的開(kāi)發(fā)系統(tǒng)。
在概念上,控制者和提供服務(wù)者是上位機(jī),被控制者和被服務(wù)者是下位機(jī),也可以理解為主機(jī)和從機(jī)的關(guān)系,但上位機(jī)和下位機(jī)是可以轉(zhuǎn)換的。
那么我今天就來(lái)制作這樣一款上位機(jī),主要用來(lái)實(shí)現(xiàn)獲取開(kāi)發(fā)板的數(shù)據(jù),并進(jìn)行判別,顯示不同的提示。還可以發(fā)送給單片機(jī)相關(guān)數(shù)據(jù)。
準(zhǔn)備
- 帶串口的單片機(jī)(用來(lái)進(jìn)行測(cè)試,沒(méi)有也行)
- Visual Studio 2019
- 設(shè)置波特率等串口參數(shù)
- 打開(kāi)串口
- 檢測(cè)串口
- 發(fā)送數(shù)據(jù)
- 接收數(shù)據(jù)
- 調(diào)整格式
- 檢測(cè)收發(fā)數(shù)據(jù)的字節(jié)總量
- 清空接收區(qū)和發(fā)送區(qū)
- 對(duì)收到的數(shù)據(jù)進(jìn)行處理
- 設(shè)置串口數(shù)據(jù)緩沖等待時(shí)間
界面設(shè)計(jì)
關(guān)鍵程序
打開(kāi)串口
if (cbbComList.Items.Count <= 0)
{
MessageBox.Show("沒(méi)有發(fā)現(xiàn)串口,請(qǐng)檢查線路!");
return;
}
if (ComDevice.IsOpen == false)
{
ComDevice.PortName = cbbComList.SelectedItem.ToString();
//ComDevice.BaudRate = Convert.ToInt32(cbbBaudRate.SelectedItem.ToString());
ComDevice.BaudRate = Convert.ToInt32(cbbBaudRate.Text.ToString());
ComDevice.Parity = (Parity)Convert.ToInt32(cbbParity.SelectedIndex.ToString());
ComDevice.DataBits = Convert.ToInt32(cbbDataBits.SelectedItem.ToString());
ComDevice.StopBits = (StopBits)Convert.ToInt32(cbbStopBits.SelectedItem.ToString());
time = Convert.ToInt32(cbBox_time.Text.Trim());
try
{
ComDevice.DataReceived += new SerialDataReceivedEventHandler(Com_DataReceived);
ComDevice.Open();
btnSend.Enabled = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
btnOpen.Text = "關(guān)閉串口";
pictureBox1.BackgroundImage = Properties.Resources.green;
}
else
{
try
{
ComDevice.DataReceived -= new SerialDataReceivedEventHandler(Com_DataReceived);//取消綁定COM接收
Thread.Sleep(1000);
ComDevice.Close();
btnSend.Enabled = false;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
btnOpen.Text = "打開(kāi)串口";
pictureBox1.BackgroundImage = Properties.Resources.red;
}
cbbComList.Enabled = !ComDevice.IsOpen;
cbbBaudRate.Enabled = !ComDevice.IsOpen;
cbbParity.Enabled = !ComDevice.IsOpen;
cbbDataBits.Enabled = !ComDevice.IsOpen;
cbbStopBits.Enabled = !ComDevice.IsOpen;
cbBox_time.Enabled = !ComDevice.IsOpen;
發(fā)送數(shù)據(jù)
if (ComDevice.IsOpen)
{
try
{
ComDevice.Write(data, 0, data.Length);//發(fā)送數(shù)據(jù)
return true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
MessageBox.Show("串口未打開(kāi)", "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
return false;
接收數(shù)據(jù)
//等待緩沖區(qū)數(shù)據(jù)
Thread.Sleep(time);
byte[] ReDatas = new byte[ComDevice.BytesToRead];
byte[] DIY = new byte[ComDevice.BytesToRead];
DIY[0] =0x6F;
ComDevice.Read(ReDatas, 0, ReDatas.Length);//讀取數(shù)據(jù)
if (ReDatas[0] ==0x63 )
{
MessageBox.Show("正確");
}
else
MessageBox.Show("錯(cuò)誤");
//丟棄接收緩沖區(qū)數(shù)據(jù)
ComDevice.DiscardInBuffer();
this.AddData(ReDatas);//輸出數(shù)據(jù)
實(shí)現(xiàn)頁(yè)面
-
單片機(jī)
+關(guān)注
關(guān)注
6030文章
44489瀏覽量
631990 -
上位機(jī)
+關(guān)注
關(guān)注
27文章
930瀏覽量
54696 -
下位機(jī)
+關(guān)注
關(guān)注
0文章
93瀏覽量
18716
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論