如何在一台电脑上调试串口收发数据

如何在一台电脑上调试串口收发数据,第1张

你这台电脑上有串口吗?只有一个串口吗?是那种DB9针的真正的串口。

调试串口收/发数据,只是在电脑上调试吗?当然是要有两个串口才好做调试啦。

比较简便可行的,就是买一条USB转串口线,注意,电脑上原有的串口是DB9针的,应该买一个DB9孔型的串口,这样,直接插到电脑上原有的串口上,USB转串口安装驱动程序后就虚拟出一个串口来,两个串口就可以互相收/发调试了。

/

模拟串口试验

作者:lfc9861@163com QQ:77473067

CPU:89S52

晶振:110592MHz

功能:将模拟接收口数据通过模拟发送口发送,通信波特率9600Bps

建议:改成3线制方式,或者选择有中断引脚的CPU,这样可以大大减少CPU负担

测试用0x55,0x5A,0xA5,0xAA四个字节数据进行过实际验证

/

#include <reg52h>

sbit TxPin = P3^1; //设置发送引脚

sbit RxPin = P3^0; //设置接收引脚

unsigned char RxBuf[4]; //接收的数据缓冲区

unsigned char RxdP; //接收位置指针(字节)

unsigned char RxpTime; //接收间断时间监控

unsigned char RxEndBit; //接收完成标志

/

函数原型:void Delay(unsigned char Val)

函数作用:延时

输入参数:Val 延时参数

输出参数:无

注意:

/

void Delay(unsigned char Val)

{

while(Val--) ;

}

/

函数原型:void TxData(unsigned char Val)

函数作用:通过模拟串口引脚发送数据

输入参数:Val 待发送的数据(8Bit)

输出参数:无

注意: 发送中时序很关键,发送前必须关闭中断

/

void TxData(unsigned char Val)

{

unsigned char i;

TxPin = 0; //发送起动符

Delay(13);

for(i = 0x01; i != 0; i <<= 1)

{

if((Val & i) != 0)

{

TxPin = 1;

}

else

{

TxPin = 0;

}

Delay(12);

}

TxPin = 1; //发送停止符

Delay(14);

TxPin = 1;

}

/

函数原型:void Time0() interrupt 1

函数作用:定时监控接收引脚状态并接收数据

输入参数:无

输出参数:无

注意: 对CPU负担巨大

/

void Time0() interrupt 1

{ unsigned char i;

if(0 == RxPin) //找到启动符

{

TR0 = 0; //暂停定时器

RxBuf[RxdP] = 0;

Delay(15);

for(i = 0x01; i != 0 ; i <<= 1) //最低位开始接收

{

if(0 != RxPin)

{

RxBuf[RxdP] |= i;

}

Delay(12);

}

Delay(10);

RxpTime = 0;

TR0 = 1;

RxdP++;

if(RxdP >= 4)

{

RxdP = 0;

RxEndBit = 1; //接收完成,置标志

}

}

else

{

RxpTime++;

}

}

/

函数原型:unsigned int main(void)

函数作用:演示主程序

输入参数:无

输出参数:无

/

unsigned int main(void)

{

unsigned char i;

TxPin = 1; //发送端预置

RxEndBit = 0;

RxdP = 0;

TMOD = 0x02; //定时器初始化

TL0 = 0xd2; //48uS

TH0 = 0xd2;

ET0 = 1;

PT0 = 1;

TR0 = 1;

EA = 1;

while(1)

{

if(RxEndBit != 0) //有接收到完整数据

{

TR0 = 0;

for(i = 0; i < 4; i++) //将接收的4字节数据转发

{

TxData(RxBuf[i]);

}

RxEndBit = 0;

TR0 = 1;

}

else

{

if(RxpTime > 80)

{

RxpTime = 0;

RxdP = 0;

}

}

}

return 0;

}

#include <reg51h>

#include <intrinsh>

unsigned char key_s, key_v, tmp;

char code str[] = "welcome! >

bit scan_key();

void proc_key();

void delayms(unsigned char ms);

void send_char(unsigned char txd);

sbit K1 = P1^4;

main()

{

TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率

TH1 = 0xFD; // 波特率9600

TL1 = 0xFD;

SCON = 0x50; // 设定串行口工作方式

PCON &= 0xef; // 波特率不倍增

TR1 = 1; // 启动定时器1

IE = 0x0; // 禁止任何中断

while(1)

{

if(scan_key()) // 扫描按键

{

delayms(10); // 延时去抖动

if(scan_key()) // 再次扫描

{

key_v = key_s; // 保存键值

proc_key(); // 键处理

}

}

if(RI) // 是否有数据到来

{

RI = 0;

tmp = SBUF; // 暂存接收到的数据

P0 = tmp; // 数据传送到P0口

send_char(tmp); // 回传接收到的数据

}

}

}

bit scan_key()

// 扫描按键

key_s = 0x00;

key_s |= K1;

return(key_s ^ key_v);

}

void proc_key()

// 键处理

{

if((key_v & 0x01) == 0)

{ // K1按下

send_str(); // 传送字串"welcome!

}

}

void send_char(unsigned char txd)

// 传送一个字符

{

SBUF = txd;

while(!TI); // 等特数据传送

TI = 0; // 清除数据传送标志

}

void send_str()

// 传送字串

{

unsigned char i = 0;

while(str[i] != '\0')

{

SBUF = str[i];

while(!TI); // 等特数据传送

TI = 0; // 清除数据传送标志

i++; // 下一个字符

}

}

void delayms(unsigned char ms)

// 延时子程序

{

unsigned char i;

while(ms--)

{

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

}

}

C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。

你应该是使用keil软件仿真,使用虚拟串口模拟串口收发数据的吧!

如果要keil收到整帧的数据,那么把断点位置修改下,在接收缓存收完全部数据的时候软件设个标志,将断点设到标志后面,标志改变就进断点。就可以收完整串数据了。

而如果在接收处设断点,每次收到一个数据就进断点,程序就停了。

还有就是必须有接收缓冲区,存储接收数据。

我前几天也做模拟串口程序,也遇到了与你类似的问题,不过现在解决了。

数据格式由一个起始位,八个数据位,一个或两个结束位组成。在数据发送是结束位是不能省。

但在数据接收时,程序中就没有必要等待结束位了,因为在等待结束位的过程中,把下一个数据的起始中断也等待过去了。

把函数uchar RByte()中的最后一个WaitTF0();删除,程序就能连续接收数据了。

下面是我的程序,你看一下就明白了。

/

模拟串口收发程序

改程序发送口采用任一IO口,接收口采用外部中断0口,实现了9600bit/s的串口通信

信号产生与接收采用定时器定时溢出标志来进行控制

注意问题:

1、中断的中断标志要保证状态正确

2、定时器定时要精确

/

#include<reg52h>

sbit txd=P3^1;

sbit rxd=P3^2;

sbit en=P1^7;

sbit clk=P3^7;

#define uchar unsigned char

uchar number,flag;

uchar num[10]={0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};

void wait(uchar i);

void send(uchar aa);

void main()

{

uchar i;

IE=0;EA=1;

TMOD=0x12;

TR0=0;EX0=1;

IT0=1;en=0;

while(1)

{

if(num[0]==0x49&&num[1]==0x85&&num[2]==0x54&&num[3]==0x31&&num[4]==0x59&&num[5]==0x87&&num[6]==0x91&&num[7]==0x25&&num[8]==0x34&&num[9]==0x62)

{

en=1;

number=0;

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

{send(num[i]);num[i]=0x00;}

en=0;

}

}

}

void send(uchar aa)

{

uchar i;

txd=0;

wait(0xb9);

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

{txd=aa&0x01;aa>>=1;wait(0xb9);}

txd=1;

wait(0xb9);

flag=0;

}

void int0() interrupt 0

{

uchar i;

EX0=0;clk=!clk;

wait(0xad);

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

{

number>>=1;clk=!clk;

if(rxd)number=0x80|number;

else number=0x00|number;

wait(0xb9);

}

number>>=1;clk=!clk;

if(rxd)number=0x80|number;

else number=0x00|number;

wait(0xd9);

num[flag]=number;

flag++;clk=!clk;

IE0=0;EX0=1;

if(flag>=10)flag=0;

}

void wait(uchar i)

{

TF0=0;

TH0=i;TL0=i;

TR0=1;

while(TF0==0);

TF0=0;TR0=0;

}

以上就是关于如何在一台电脑上调试串口收发数据全部的内容,包括:如何在一台电脑上调试串口收发数据、哥们帮我看看这个程序吧~模拟串口收发四个字节 接收正常 发送不正常~感激不尽~辛苦了~、C语言变成实现串口收发数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10627395.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存