下位机单片机c语言发送数据到串口,上位机pc机java语言获取端口数据

环境:

Windows7 64b,jdk64b,myeclipse8.5,rxtx开发包,STC,keil,格西烽火,51单片机,rs232USB转串口线。

下位机c代码

#include <reg51.h>

#include <string.h>

#define INBUF_LEN 7   //数据长度

unsigned char inbuf1[INBUF_LEN];

unsigned char checksum,count3,count=0;

bit           read_flag=0;

unsigned char com[]="hello\n";

void init_serialcomm(void)

{

TMOD=0x20;//设置定时器1为模式2

TH1=0xfd;//装初值设定波特率

TL1=0xfd;

TR1=1;//启动定时器

SM0=0;//串口通信模式设置

SM1=1;

}

void delay_1s()     //1s

{

unsigned int i;

for(i=0;i<45000;i++)

{

}

}

void delay_1us()     //1s

{

unsigned int i;

for(i=0;i<45;i++)

{

}

}

//向串口发送一个字符

void send_char_com(char ch)

{

SBUF=ch;

while(TI==0);

TI=0;

delay_1us();

}

//向串口发送一个字符串,strlen为该字符串长度

void send_string_com(char *str,int strlen)

{

int k=0;

do

{

send_char_com(*(str + k));

k++;

} while(k < strlen);

}

//串口接收中断函数

void serial () interrupt 4 using 3

{

if(RI)

{

unsigned char ch1;

RI = 0;

ch1=SBUF;

inbuf1[count++]=ch1;

if(count==INBUF_LEN)

{

read_flag=1;  //如果串口接收的数据达到INBUF_LEN个,且校验没错,

count=0;      //就置位取数标志

}

}

}

main()

{

init_serialcomm();  //初始化串口

delay_1s();

send_string_com("10.7",4);

return 1;

}

上位机java代码

import gnu.io.CommPort;

import gnu.io.CommPortIdentifier;

import gnu.io.SerialPort;

import java.io.FileDescriptor;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.sql.*;

public class TwoWaySerialComm

{

public TwoWaySerialComm()

{

super();

}

void connect ( String portName ) throws Exception

{

CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);

if ( portIdentifier.isCurrentlyOwned() )

{

System.out.println("Error: Port is currently in use");

}

else

{

CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);

if ( commPort instanceof SerialPort )

{

SerialPort serialPort = (SerialPort) commPort;

serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);

InputStream in = serialPort.getInputStream();

OutputStream out = serialPort.getOutputStream();

(new Thread(new SerialReader(in))).start();

(new Thread(new SerialWriter(out))).start();

}

else

{

System.out.println("Error: Only serial ports are handled by this example.");

}

}

}

/** */

public static class SerialReader implements Runnable

{

InputStream in;

public SerialReader ( InputStream in )

{

this.in = in;

}

public void run ()

{

byte[] buffer = new byte[1024];

int len = -1;

String com_get="";

DBInsert DI=new DBInsert();

try

{

while ( ( len = this.in.read(buffer)) > -1 )

{

//延时10秒

try {

Thread.sleep(10000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

//com_get保存串口数据

com_get=new String(buffer,0,2);

System.out.print(com_get);

}

}

catch ( IOException e )

{

e.printStackTrace();

}

}

}

/** */

public static class SerialWriter implements Runnable

{

OutputStream out;

public SerialWriter ( OutputStream out )

{

this.out = out;

}

public void run ()

{

try

{

int c = 0;

while ( ( c = System.in.read()) > -1 )

{

this.out.write(c);

}

}

catch ( IOException e )

{

e.printStackTrace();

}

}

}

public static void main ( String[] args )

{

try

{

(new TwoWaySerialComm()).connect("COM3");

}

catch ( Exception e )

{

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

可能出现的问题

获取到的是乱码

可能是没打开单片机的开关按钮

提示open方法错误

可能是没关闭格西烽火或者myeclipse,两者不能同时打开。

提示找不到串口

检查下你的STC和代码,看是否端口正确。

时间: 2024-10-29 19:07:55

下位机单片机c语言发送数据到串口,上位机pc机java语言获取端口数据的相关文章

Java运行时数据区

Java虚拟机定义了一些程序运行期间会使用到的数据区域,其中一些会随着JVM的启动而创建,随着JVM的退出而销毁:另外一些则与线程的运行一一对立的,这些数据区域会随着线程的开始而创建,随着线程的结束而销毁.下面是一张Java运行时的数据区模型图: 总的来说,Java运行时数据区域可以分为两个部分:线程共享的区域和线程独享的区域.下面一一对之进行总结. 一.线程共享区域:线程共享区域是指各个线程都会使用到的一块空间区域,它们会在这里申请空间.使用空间.根据具体提供功能不同,可以划分为两个部分,分别

学编程,学java还是大数据、android?平均月薪23k以上告诉你方向

学编程,学java还是大数据.android?有不少同学在纠结中,最近有不少初学者来问到,学习大数据,学习spark,公司主要使用那些语言编写,每听到这一个问题,起码还是很不错的,证明你已经开始学习大数据了,并了解大数据Spark是可以使用多种语言来实现开发的,那就是Java.Scala.Python和R语言都可以使用,但R语言本人不常用. 学编程,学java还是大数据.android?平均月薪23k以上告诉你方向正常来讲学习大数据之前都要做到以下几点: 1.学习基础的编程语言(java,pyt

java把excel数据批量导入到数据库

java把excel数据批量导入到数据库中,java导入excel数据代码如下 1.    public List<Choice> GetFromXls(String xlsname){ 2. 3.        List<Choice> choices = new ArrayList<Choice>(); 4.        Choice choice=null; 5.        try { 6.            java.io.File file=new

局域网控制系统-下位机-单片机

1 /*----------------------------------- 2 多功能下位机 3 STC89C52RC 11.0592MHz 4 5 -----------------------------------*/ 6 #include<reg52.h> 7 #include<intrins.h> 8 9 char code huanhang[3]={0x0d,0x0a,0}; // "\r\n" 10 //-----------------普通输

串口调试助手-发送数据,按字符或16进制显示接收数据的C#程序

一. 新手上路,一般几种方法来学习VS2010的C#编程: 1.查阅各种书籍和技术文档,传统而耗时: 2.借助视频教程快速上手,省事有效却无法掌握一些小细节,写起程序来,各种调试不通过,还是浪费时间: 3.直接采用网络大神的程序,在运行成功的前提下,再仔细消化各种精髓,方法虽然高效,但也是建立在作者编写文档友好的情况下. 对于以上的第一种适合那种不着急项目进度,只管自己开心满足自己兴趣的新手,第二种适合那种需要赶进度.不需要太注意小细节的项目,第三种属于技术渣,为了像我这种技术渣的新手们上路更轻

基于AVR的串口与PC机通信代码(uart8位数据)

为了以后根据此代码继续改进功能,特意把代码放在此处,也和大家一起学习. /************************************ AVR时钟:8.00MHz *波特率9600(51)8位数据,1位停止,当波特率设置为19200时,UBRR=25,4800=103 *注:波特率设置9600最佳,别的数据不稳定,不同波特率对应的UBRR值参考手册 *PC机向开发板发送一个字符,开发板将其大写字母回写给PC机 ***********************************/

改善 C# 的语言习惯(一) - 使用属性而不是可访问的数据成员(整理中)

改善 C# 的语言习惯(一) - 使用属性而不是可访问的数据成员 序 为什么我们的程序运行得棒棒的,还要改呢?Why? 答:我们要让程序运行得更快,执行的效率更高,代码的可读性更强,维护的成本更低... .... 我们知道,守旧主义并不适用于计算机行业. 在这里,我会告诉你已经弃用或者应该弃用的东西,并告诉你推荐的用法,以及弃用的原因和推荐使用的原因.

单片机脚本语言-移植lua到stm32-MDK

Lua简介 Lua[1]  是一个小巧的脚本语言.作者是巴西人.该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用.不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和维护. Lua的目标是成为一个很容易嵌入其它语言中使用的语言.大多数程序员也认为它的确做到了这一点. 很多应用程序使用LUA作为自己的嵌入式脚本

基于X86平台的PC机通过网络发送一个int(32位)整数的字节顺序

1.字节顺序 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端.大端两种字节顺序.小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处:大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处.计算机中读取数据的时候是从高地址到低地址,存储数据时候相反! 2.主机字节序到网络字节序 基于X86平台的PC机是小端字节序的,而有的嵌入式平台则是大端字节序的.因而对int.uint16.uint32等多于1字节类型的数据,在这些嵌入式平台上应该变换其存储顺