如何连接手机到电脑
手机和电脑显示器的联接已经成为了现代生活中不可或缺的一部分。无论是在办公室还是在家里,我们都需要将手机上的内容投射到电脑显示器上,以便更好地展示、共享和处理信息。本文将讨论如何实现这种联接,并介绍一些...
2024.11.22对于51单片机的串口:从逻辑上来说,SBUF独有一个,它既表示发送寄存器,又表示接管寄存器,具有同一个单元地址99H。但在物理构造上,则有两个完全独立的SBUF,一个是发送缓冲寄存器SBUF,另一个相对应的就是接管缓冲寄存器SBUF。假如CPU写SBUF,数据就会被送入发送寄存器准备发送;假如CPU读SBUF,则读入的数据一定来自接管缓冲器。即CPU对SBUF的读写,其实是分别访问上述两个不同的寄存器。 a = SBUF; SBUF = a;也就是说:51单片机的sbuf寄存器是以字节为单位进行接管和发送的,一次只能接管一个字节。
我们整个程序的逻辑就是:
51单片机端每收到一个字节就发送一个字节到电脑。也就是数据全部原样返回。
电脑端是直接调用API进行底层的字节数组写入,先写入一堆字符串。然后延时500ms,然后再从串口中读取单片机返回的数据。我的猜想是电脑的串口也和51单片机的串口应该类似,有专门接管的寄存器或者其它存储格式,然后有个缓冲的字节数组进行字节缓冲。电脑直接从缓冲数组读取过来即可。
然后先来看51单片机端的代码:
#include
#define uchar unsigned char
#define uint unsigned int
uchar num;
void UART_init()
{
TMOD = 0x20; //T1工作模式2 8位自动重装
TH1 = 0xfd;
TL1 = 0xfd; //比特率9600
TR1 = 1;//启动T1定时器
SM0 = 0;
SM1 = 1; //串口工作方式1 10位异步
REN = 1;//串口允许接收
EA = 1;//开总中断
ES = 1;//串口中断打开
}
void main()
{
UART_init(); //串口初始化
while(1);
}
void UART() interrupt 4
{
if(RI)//检测是否接收完成
{
num = SBUF; //num取出接收缓存器的值,接收一个字节就发送一个
RI = 0;
SBUF = num;
while(!TI);//装上数据后TI为0,发送完数据后TI为1
TI = 0;
}
}
这里是采用中断的方式进行串口通信。当串口一收到数据就产生中断,然后进入中断处理函数,先取出接收寄存器里的数据,然后放入发送寄存器里发生。
这里注意单片机端对串口的设置:串口为工作方式1,也就是10位异步收发器,8位数据位,也就是一个字节。专业点就是:一帧数据为10位,1位起始位(低电平),8位数据位(低位在前)和1位停止位(高电平)。比特率为9600.
我们在电脑这边打开电脑的串口的时候,也要这样进行设置串口的参数。不然会出问题。
然后来看电脑这边的java代码:
package a51cs.startuse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.UnsupportedCommOperationException;
public class Tools {
/**
*用于打开串口
*
* @param portName
* 串口名
* @param baudrate
* 波特率
* @return返回串口
*/
public static final SerialPort portParameterOpen(String portName, int baudrate) {
SerialPort serialPort = null;
try { //通过端口名识别串口
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
//打开端口并设置端口名字 serialPort和超时时间 2000ms
CommPort commPort = portIdentifier.open(portName, 1000);
//进一步判断comm端口是否是串口 instanceof
if (commPort instanceof SerialPort) {
System.out.println("该COM端口是串口!串口名称是:" + portName);
//进一步强制类型转换
serialPort = (SerialPort) commPort;
//设置baudrate此处需要注意:波特率只能允许是int型对于57600足够
// 8位数据位
// 1位停止位
//无奇偶校验
serialPort.setSerialPortParams(baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
//串口配制完成 log
System.out.println("串口参数设置已完成,波特率为" + baudrate + ",数据位8bits,停止位1位,无奇偶校验");
} else { //不是串口
System.out.println("该com端口不是串口,请检查设备!");
//将com端口设置为null默认是null不需要操作
}
} catch (NoSuchPortException e) {
e.printStackTrace();
} catch (PortInUseException e) {
e.printStackTrace();
} catch (UnsupportedCommOperationException e) {
e.printStackTrace();
}
return serialPort;
}
/**
*发送一个字节数组到串口
*
* @param serialPort
* 串口
* @param dataPackage
* 字节数组
*/
public static void uartSendDatatoSerialPort(SerialPort serialPort, byte[] dataPackage) {
OutputStream out = null;
try {
out = serialPort.getOutputStream(); //和socket通信差不多,获取输出流然后调用write方法写入字节数组
out.write(dataPackage);
out.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭输出流非常标准的格式!!!
if (out != null) {
try {
out.close();
out = null;
// System.out.println("数据已发送完毕!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/*
*上位机接收数据串口对象seriesPort接收数据buffer返回一个byte数组
*/
public static byte[] uartReceiveDatafromSingleChipMachine(SerialPort serialPort) {
byte[] receiveDataPackage = null;
InputStream in = null;
try {
in = serialPort.getInputStream();
//获取data buffer数据长度
int bufferLength = in.available();
while (bufferLength != 0) {
receiveDataPackage = new byte[bufferLength];
in.read(receiveDataPackage);
bufferLength = in.available();
}
} catch (IOException e) {
e.printStackTrace();
}
return receiveDataPackage;
}
public static void main(String[] args) throws Exception {
//打开串口
SerialPort serialPort = portParameterOpen("COM3", 9600);
//要发送的数据
String dataSend = "Java和51单片机串口通信测试";
int i = 1;
while (true) {
//发送数据到单片机
byte[] datByte = dataSend.getBytes();//转化为字节数组,我这边设置了默认为utf-8编码
uartSendDatatoSerialPort(serialPort, datByte);
System.out.println("-------------------------------------------------------");
System.out.println((i++) + ".发送到串口的数据:" + dataSend);
//休眠500ms,等待单片机反应
Thread.sleep(500);
//从单片机接收到的数据,返回的是一个字节数组
byte[] dat = uartReceiveDatafromSingleChipMachine(serialPort);
if (dat != null && dat.length > 0) {
String dataReceive = new String(dat, "utf-8");//字节数组以utf-8编码表编码成字符进行显示
System.out.println((i++) + ".从串口接收的数据:" + dataReceive);
} else {
System.out.println("接收到的数据为空!");
}
}
}
}
本期先分享到这里,想要进群学习单片机编程的同学可以私信我,回复“我要入门”,与我们一起成长,喜欢的可以点个赞关注我们!
手机和电脑显示器的联接已经成为了现代生活中不可或缺的一部分。无论是在办公室还是在家里,我们都需要将手机上的内容投射到电脑显示器上,以便更好地展示、共享和处理信息。本文将讨论如何实现这种联接,并介绍一些...
2024.11.22现在很多手机的摄像头都会比电脑的高,因此有不少小伙伴想要在有些时候用手机摄像头代替电脑摄像头,那么具体应该如何操作呢?下面就和小编一起来看看连接手机摄像头的方法吧。更多win11安装教程参考小白一键装...
2024.11.22随着手机越来越重要,绝大多数人都会拥有一部手机,相比之下,电脑的使用频率则越来越低,除了办公需要外,相信很多人接触时间都比以前少了,而手机和电脑各有各的优势。手机小巧轻便携带轻松,但是缺点就是屏幕太小...
2024.11.22如何把6.1声道音乐转刻到CD光盘一般车载音乐通用支持MP3的普遍,也有支持无损的,而有部份人喜欢 CD,这个就不用说为什么了,毕竟CD音质是无话可说的了。只是现在的新车多数的己把CD播放器去掉了。我...
2024.11.22下面的联想瑜伽纸照片发布在中国社交网络微博上。显然,这是一款带有 E-Ink 显示屏的平板电脑,其三边的边缘相对较窄。一侧的宽边框使单手握持平板电脑更加容易,这样用户就不会意外触摸到触摸屏。还有足够的...
2024.11.22