如何用PC软件控制单片机的输出

我这里用的是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进行处理,非常感谢!

上一篇 2020年2月28日
下一篇 2020年2月28日

相关推荐