我想用Android手机与单片机进行串口通信,从而可以控制单片机,该如何实现呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我想用Android手机与单片机进行串口通信,从而可以控制单片机,该如何实现呢?相关的知识,希望对你有一定的参考价值。

希望提供软件和硬件设计思路
多谢你们的回答,我找到个方案,豌豆荚上找到一款软件叫android OTG2Serial,不过得买配套的USB转串口线才能使用,taobao上有卖的

我们先来说电脑怎么与单片机进行串口通信呢?方案1——“直连”电脑串口,不过中间需要个MAX232之类的电平转换模块;方案2——“直联”电脑USB口,不过中间需要USB转串口模块。好了,手机用哪种方案呢?也是方案2。现在Android手机只要系统在5.0.1以上,一般就支持USB OTG功能了,也就意味着可以支持Android的USB转串口。我是电子硬件工程师,也喜欢Android编程,历时一年多,做了个手机串口软件,分享给你。百度“路人软件”。 参考技术A 代码不会写!但是给你个思路:

1、单片机串口转WIFI了,那么WIFI传出来的数据,手机接收到要有软件解码识别它
2、手机软件通过WIFI将数据传到单片机,这样交互就可以通信了。控制协议可以自己设定。
参考技术B 建议使用gprs或者gsm模块,使用短信发送指令的方式,这是比较成熟、可靠的,易于实现。普通手机就可以控制。
如果追求智能化,那就建议用蓝牙,但是你可能需要自己开发控制用的软件。

如果只是追求实用,那就选我说的第一种,比较方便省事;
如果你是通信电子类学科的学生,建议用第二种。
参考技术C 串口通信估计有点难
首先推荐蓝牙
其次wifi
或者USB

买个蓝牙模块和单片机通信,单片机控制蓝牙和手机通信即可
参考技术D

    蓝牙模块,实现。单片机上面装个蓝牙模块。

    usb转串口通讯。

    gsm,通过移动网络来与单片机连接。

51单片机上位机编写与串口通信-深入了解串口

采用环境

VS,keil:

简单介绍

简单的利用VS写上位机 ,和51单片机进行一个通信

单片机通信原理这里不多说直接放链接CSDN有很多很详细的博客

51单片机串口通信原理讲解

C#网上很多教程这里推荐一篇更加详细的博客

C#串口编程

对于串口不理解的可以看这一篇

C#中串口通信SerialPort类

此项目下载地址

https://download.csdn.net/download/chen_taifu/19827747


代码

C51

/*
	开发者邮箱
	@m.t-chen@foxmail.com
	串口发送数据和接收
*/
#include <reg52.h>
#include <stdio.h>
#include "ccom.h"      

//串口寄存器配置
void init()

	TMOD=0x20;	  		//定时器工作方式,选择了定时器1,工作方式2 八位初值自动重装的8位定时器。		 
	TH1=0xfd;	  			//定时器1初值	,设置波特率为9600 晶振11.0529MHZ?
	TL1=0xfd;
	TR1=1;		 				//打开计数器	 TCON
	SCON=0X50;				//设置为工作方式1 (10位/8位数据)允许串口接收位
	EA=1;	      			//允许中断(总闸)
	ES=1;		 		 			//允许串口中断


void main()

	init();								//初始化
	while(1)

	  if(bzf_cz==1)				//接收到数据运行
	
		if(bzf_hh!=0)		    //是否需要换行检测
		
			bzf_hh=0;					//重置
			TI=1;						
			printf("\\n");			//换行
			while(!TI);
			TI=0;
		
			for(i=0;i<50;i++)
		
			SBUF=s[i];
			while(!TI);
			TI=0;
		
		bzf_cz=0;
	


 
void ser() interrupt 4

		if(RI)		 								//接收数据,手动将RI清0
		    
		RI=0;
		
		if(bzf_cz==0&&j!=0)  			//第二次输入后将数组a还原
		
			for(j=0;j<50;j++)				//最大50个字符
			s[j]='\\0';
			j=0;
			bzf_hh=1;								//换行标识符
		
		s[j]=SBUF;								//读取数据到s
		bzf_cz=1;						      //接收标识符
		j++;	
	 

上位机项目建立流程

新建项目/Visual C# 选择窗体应用

控件有label1 ,comboBox,textBox,button,

容器panel

组件serialPort

代码

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.Text.RegularExpressions;

namespace _51串口机

    public partial class Form1 : Form
    
        private StringBuilder sb = new StringBuilder();     //为了避免在接收处理函数中反复调用,依然声明为一个全局变量
        public Form1()
        
            InitializeComponent();

        

        private void Form1_Load(object sender, EventArgs e)
        

            int i;
            for (i = 300; i <= 38400; i = i * 2)
            
                comboBox2.Items.Add(i.ToString());  //添加波特率列表
            
            //获取电脑当前可用串口并添加到选项列表中
            comboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames());
            //批量添加波特率列表
            string[] comboxD =  "43000", "56000", "57600", "115200", "128000", "230400", "256000", "460800" ;
            comboBox2.Items.AddRange(comboxD);

            //添加数据位列表
            string[] comboxA =  "6", "7", "8" ;
            comboBox3.Items.AddRange(comboxA);

            //添加校验位列表
            string[] comboxC =  "0", "1" ;
            comboBox4.Items.AddRange(comboxC);

            //添加停止位位列表
            string[] comboxB =  "1.5", "2" ;
            comboBox5.Items.AddRange(comboxB);

            //设置默认值
            comboBox1.Text = "COM1";
            comboBox2.Text = "9600";
            comboBox3.Text = "8";
            comboBox4.Text = "None";
            comboBox5.Text = "1";
        
        private void button1_Click(object sender, EventArgs e)
        
            try
            
                //将可能产生异常的代码放置在try块中
                //根据当前串口属性来判断是否打开
                if (serialPort1.IsOpen)
                
                    //串口已经处于打开状态
                    serialPort1.Close();    //关闭串口
                    button1.Text = "打开串口";
                    button1.BackColor = Color.ForestGreen;
                    comboBox1.Enabled = true;
                    comboBox2.Enabled = true;
                    comboBox3.Enabled = true;
                    comboBox4.Enabled = true;
                    comboBox5.Enabled = true;
                    textBox1.Text = "";     //清空接收区
                    textBox2.Text = "";     //清空发送区
                
                else
                
                    //串口已经处于关闭状态,则设置好串口属性后打开
                    comboBox1.Enabled = false;
                    comboBox2.Enabled = false;
                    comboBox3.Enabled = false;
                    comboBox4.Enabled = false;
                    comboBox5.Enabled = false;
                    serialPort1.PortName = comboBox1.Text;
                    serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text);
                    serialPort1.DataBits = Convert.ToInt16(comboBox3.Text);

                    if (comboBox4.Text.Equals("None"))
                        serialPort1.Parity = System.IO.Ports.Parity.None;
                    else if (comboBox4.Text.Equals("Odd"))
                        serialPort1.Parity = System.IO.Ports.Parity.Odd;
                    else if (comboBox4.Text.Equals("Even"))
                        serialPort1.Parity = System.IO.Ports.Parity.Even;
                    else if (comboBox4.Text.Equals("Mark"))
                        serialPort1.Parity = System.IO.Ports.Parity.Mark;
                    else if (comboBox4.Text.Equals("Space"))
                        serialPort1.Parity = System.IO.Ports.Parity.Space;

                    if (comboBox5.Text.Equals("1"))
                        serialPort1.StopBits = System.IO.Ports.StopBits.One;
                    else if (comboBox5.Text.Equals("1.5"))
                        serialPort1.StopBits = System.IO.Ports.StopBits.OnePointFive;
                    else if (comboBox5.Text.Equals("2"))
                        serialPort1.StopBits = System.IO.Ports.StopBits.Two;

                    serialPort1.Open();     //打开串口
                    button1.Text = "关闭串口";
                    button1.BackColor = Color.Firebrick;
                
            
            catch (Exception ex)
            
                //捕获可能发生的异常并进行处理

                //捕获到异常,创建一个新的对象,之前的不可以再用
                serialPort1 = new System.IO.Ports.SerialPort();
                //刷新COM口选项
                comboBox1.Items.Clear();
                comboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames());
                //响铃并显示异常给用户
                System.Media.SystemSounds.Beep.Play();
                button1.Text = "打开串口";
                button1.BackColor = Color.ForestGreen;
                MessageBox.Show(ex.Message);
                comboBox1.Enabled = true;
                comboBox2.Enabled = true;
                comboBox3.Enabled = true;
                comboBox4.Enabled = true;
                comboBox5.Enabled = true;
            
        

        private void SerialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        
            sb.Clear();                              //防止出错,首先清空字符串构造器
            int num = serialPort1.BytesToRead;      //获取接收缓冲区中的字节数
            byte[] received_buf = new byte[num];    //声明一个大小为num的字节数据用于存放读出的byte型数据

            serialPort1.Read(received_buf, 0, num);   //读取接收缓冲区中num个字节到byte8位类型 received数组中

            sb.Append(Encoding.ASCII.GetString(received_buf));  //将整个数组解码为ASCII数组
            foreach (byte b in received_buf) //遍历数组进行字符串转化及拼接
            
                sb.Append(b.ToString());
            

            try
            
                //因为要访问UI资源,所以需要使用invoke方式同步ui
                Invoke((EventHandler)(delegate
                
                    textBox1.AppendText(sb.ToString());
                
                ));

            
            catch (Exception ex)
            
                //响铃并显示异常给用户
                System.Media.SystemSounds.Beep.Play();
                MessageBox.Show(ex.Message);

            

        

        private void label6_Click(object sender, EventArgs e)
        

        

        private void button2_Click(object sender, EventArgs e)
         
            try
            

                //首先判断串口是否开启
                if (serialPort1.IsOpen)
                
                    serialPort1.Write(textBox2.Text);

                
            
            catch (Exception ex)
            
                serialPort1.Close();
                //捕获到异常,创建一个新的对象,之前的不可以再用
                serialPort1 = new System.IO.Ports.SerialPort();
                //刷新COM口选项
                comboBox1.Items.Clear();
                comboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames());
                //响铃并显示异常给用户
                System.Media.SystemSounds.Beep.Play();
                button1.Text = "打开串口";
                button1.BackColor = Color.ForestGreen;
                MessageBox.Show(ex.Message);
                comboBox1.Enabled = true;
                comboBox2.Enabled = true;
                comboBox3.Enabled = true;
                comboBox4.Enabled = true;
                comboBox5.Enabled = true;
            
        

        private void button3_Click(object sender, EventArgs e)
        
            textBox2.Text = "";  //清空接收文本框
            textBox1.Text = "";     //清空发送文本框
        
    

以上是关于我想用Android手机与单片机进行串口通信,从而可以控制单片机,该如何实现呢?的主要内容,如果未能解决你的问题,请参考以下文章

Android studio蓝牙app的串口是啥

借助ESP8266 WIFI模块,实现Android手机有人网络调试助手(或Android手机网络调试助手)与单片机互相通信。

Android蓝牙串口通信控制Arduino全彩呼吸灯

单片机串口通信控制led灯的点亮

C语言编写串口通信程序在裸机下运行

51系列单片机与PC端串口调试助手进行串口通信