我这里用的是STM8单片机+VS2019C#平台实现的串口控制。
下面附上单片机的程序,就是简单的串口通讯程序,STVD的开发环境,用的是寄存器版。
/* MAIN.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
#include “STM8S103F.h” //头文件
_Bool LED@PD_ODR:4; //位定义
void delay(unsigned int x) //延时函数
{
unsigned char i;
while(x–)
for(i=0;i<120;i++);
}
void uartinit(void) //串口初始化
{
UART1_BRR2=0X00;
UART1_BRR1=0X0d;//波特率
UART1_CR1=0X00;
UART1_CR2=0X2C; //发送接收使能,接收中断
}
void initport(void)//端口初始化
{
PD_DDR|=0x10; //LED口输出模式
PD_CR1|=0x10; //推挽输出
PD_CR2&=~0X10;
PD_DDR&=~0X40; //RX口输入模式
PD_CR1|=0X40;
PD_CR2&=~0X40;
}
void main()//主函数
{
initport();
uartinit();
_asm(“rim”); //中断优先
while (1)
{
;
}
}
@far @interrupt void rx (void) //中断服务函数
{
while(!UART1_SR&0X20); //查询接收标志位是否为1
UART1_SR&=~0X20; //接收标志位清零
if(UART1_DR==0x00)//上位机发送,读当前状态
{
if(LED==0) //如果LED低电平 发送0x55给上位机
{
UART1_DR=0x55;
while(!UART1_SR&0X40);
UART1_SR&=~0X40;
}
if(LED==1)//如果LED高电平 发送0xaa给上位机
{
UART1_DR=0xAA;
while(!UART1_SR&0X40);
UART1_SR&=~0X40;
}
}
if(UART1_DR==0X55) //上位机控制 单片机接收到0x55 点亮LED
{
LED=0;
}
if(UART1_DR==0Xaa) //上位机控制 单片机接收到0XAA 熄灭LED
{
LED=1;
}
return;
}
下面是上位机程序部分。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.IO.Ports;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Management;
namespace 点亮LED
{
public partial class frm1 : Form
{
public frm1()
{
InitializeComponent();
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
}
private void Frm1_Load(object sender, EventArgs e)
{
//初始化串口
//选择串口端
/*string[] tab_com = new string[] { “Com1”, “Com2”, “Com3”, “Com4”, “Com5”, “Com6”, “Com7”, “Com8”, “Com9”, “Com10”, “Com11”, “Com12”, “Com13”, “Com14”, “Com15” };
foreach (string str in tab_com)
{
comboBox1.Items.Add(str);
}*/
//波特率
string[] tab_Baud = new string[] { “110”, “300”, “600”, “1200”, “2400”, “4800”, “9600”, “14400”, “19200”, “38400”, “56000”, “57600”, “115200”, “128000”, “256000” };
foreach (string str in tab_Baud)
{
comboBox2.Items.Add(str);
}
//数据位
string[] tab_data = new string[] { “5”, “6”, “7”, “8” };
foreach (string str in tab_data)
{
comboBox3.Items.Add(str);
}
//停止位
string[] tab_stop = new string[] {“None”,”One”, “Two”, “OnePointFive” };
foreach (string str in tab_stop)
{
comboBox4.Items.Add(str);
}
//校验位
string[] tab_jy = new string[] { “None”, “Odd”, “Even”,”Mark”,”Space” };
foreach (string str in tab_jy)
{
comboBox5.Items.Add(str);
}
//自动获取有效端口
string[] ports;
ports = SerialPort.GetPortNames();//获取端口
comboBox1.Items.Clear();//清除原始端口
comboBox1.Items.AddRange(ports);//添加获取到的端口
comboBox1.SelectedItem = comboBox1.Items[0];//首选端口
}
private void Button1_Click(object sender, EventArgs e)
{
if (!serialPort1.IsOpen)
{
try
{
serialPort1.PortName = comboBox1.Text;//端口
serialPort1.BaudRate = Convert.ToInt16(comboBox2.Text);//波特率
serialPort1.DataBits = Convert.ToInt16(comboBox3.Text);//数据位
switch (comboBox4.Text)//停止位
{
case”None”:serialPort1.StopBits = StopBits.None;break;
case “One”: serialPort1.StopBits = StopBits.One; break;
case “Two”: serialPort1.StopBits = StopBits.Two; break;
case “OnePointFive”: serialPort1.StopBits = StopBits.OnePointFive; break;
}
switch (comboBox5.Text)//校验位
{
case “None”: serialPort1.Parity = Parity.None; break;
case “Odd”: serialPort1.Parity = Parity.Odd; break;
case “Even”: serialPort1.Parity = Parity.Even; break;
case “Mark”: serialPort1.Parity = Parity.Mark; break;
case “Space”: serialPort1.Parity = Parity.Space; break;
}
serialPort1.Open();
button1.Text = “关闭端口”;
pictureBox1.BackColor = Color.GreenYellow;
pictureBox1.BorderStyle =BorderStyle.Fixed3D;
comboBox1.Enabled = false;
comboBox2.Enabled = false;
comboBox3.Enabled = false;
comboBox4.Enabled = false;
comboBox5.Enabled = false;
button4.Enabled = false;
//读当前状态
byte[] fasong = new byte[1];
fasong[0] = Convert.ToByte(“00”, 16);
serialPort1.Write(fasong, 0, 1);
}
catch
{
MessageBox.Show(“端口打开失败”, “错误”);
}
}
else
{
try
{
serialPort1.Close();
button1.Text = “打开端口”;
pictureBox1.BackColor = Color.DeepPink;
pictureBox1.BorderStyle = BorderStyle.None;
comboBox1.Enabled = true;
comboBox2.Enabled = true;
comboBox3.Enabled = true;
comboBox4.Enabled = true;
comboBox5.Enabled = true;
button4.Enabled = true;
}
catch
{
MessageBox.Show(“端口关闭失败”, “错误”);
}
}
}
private void Button2_Click(object sender, EventArgs e)
{
if(!serialPort1.IsOpen)
{
MessageBox.Show(“端口没有打开,请重试!”, “错误”);
}
else
{
byte[] fasong = new byte[1];
fasong[0] = Convert.ToByte(“55”,16);
serialPort1.Write(fasong, 0, 1);
button2.BackColor = Color.GreenYellow;
button3.BackColor = Color.DeepPink;
}
}
/* private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] jieshou = new byte[2];
serialPort1.Read(jieshou, 0, 1);
//textBox2.Text = Convert.ToString(jieshou[0], 16);//转换为字符型 十六进制
}*/
private void button3_Click(object sender, EventArgs e)
{
if (!serialPort1.IsOpen)
{
MessageBox.Show(“端口没有打开,请重试!”, “错误”);
}
else
{
byte[] fasong = new byte[1];
fasong[0] = Convert.ToByte(“AA”, 16);
serialPort1.Write(fasong, 0, 1);
button3.BackColor = Color.GreenYellow;
button2.BackColor = Color.DeepPink;
}
}
private void button4_Click(object sender, EventArgs e)
{
string[] ports;
ports = SerialPort.GetPortNames();//获取端口
comboBox1.Items.Clear();//清除原始端口
comboBox1.Items.AddRange(ports);//添加获取到的端口
comboBox1.SelectedItem = comboBox1.Items[0];//首选端口
/* StringBuilder sbDevHst = new StringBuilder();
ManagementObjectSearcher searcher = new ManagementObjectSearcher(“SELECT * FROM Win32_”);
foreach (ManagementObject mgt in searcher.Get())
{
sbDevHst.AppendLine(Convert.ToString(mgt[“Name”]));
sbDevHst.AppendLine(“”);
}
// return sbDevHst.ToString();//获取的字符串
label6.Text = sbDevHst.ToString();*/
}
private void button5_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start(“rundll32.exe”, @”devmgr.dll DeviceManager_Execute”);
}
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] jieshou = new byte[1];
string jieshoushu;
serialPort1.Read(jieshou, 0, 1);
jieshoushu = Convert.ToString(jieshou[0],16);
if (jieshoushu == “55”)
{
button2.BackColor = Color.GreenYellow;
button3.BackColor = Color.DeepPink;
}
if (jieshoushu==”aa”)
{
button3.BackColor = Color.GreenYellow;
button2.BackColor = Color.DeepPink;
}
}
}
}
端口设置可以选择端口 以及通讯格式,软件打开后会自动搜索当前有效端口 ,点击下降箭头可以选择,打开软件后接入新的端口,单击搜索按钮可以添加新设备。单击打开端口后红色的标签变为绿色表示端口打开成功,打开成功后软件向下位机发送一个读取当前状态0x00数据,单片机收到数据后返回当前LED状态,软件开关灯标签改变颜色,绿色表示当前状态,红色为关闭状态。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!