获取程序从串口发送的数据(软件实现)
或者用一条交叉串口线,连接两个串口,一个串口供被监控软件用,一个串口供串口助手用,串口助手可以接收发送过来的信息,串口助手可以使用格西烽火串口助手、SSCOM等软件。
怎么用串口调试工具接收PLC发送的数据
PLC本体上自带的通讯口一般是485的,通常大家都用笔记本电脑调试,因笔记本电脑基本没有带串口的,所以你需要去买一根USB-485的线,这样笔记本就有了一个串口。
然后,查看一下你的PLC的通讯口说明书,找到485通讯收发的那两根线,然后和usb的串口线的对应的收发的两根线连起来,这样硬件连接就OK了。
而后呢,你需要知道你PLC的通讯口,被设置成怎么的通讯模式,比如9600 8 N 1这样,你就需要在笔记本电脑的硬件找到你的COM口,也设置成9600 8 N 1,当然,这里只是举例,你需要保证电脑和PLC的参数设置是一样的。
完成了上述之后,就随便下载一个串口调试软件,网上这个软件很多的,打开软件,设置成你和PLC通讯的那个COM口,当然参数也需要和上述一样,在串口软件中激活当前串口,就可以接收PLC发来的信息了。
--顺便说一句,如果你发现你在PLC中发送的数据和串口调试软件中收到的数据,通常是16进制下,不一致,那么多半就是485通讯的2根线,需要对调一下。
祝你好运,请采纳,谢谢!
串口一直发送数据,怎么用软件停止?
展开全部 串行口控制寄存器SCONSCON的字节地址是98H,其格式如下:SM0、SM1:串行口工作方式控制位:SM0、SM1 工作方式 功能 波特率 00 方式0 同步移位寄存器 fosc/1201 方式1 8位UART 可变(T1溢出率)10 方式2 9位UART fosc/64或fosc/3211 方式3 9位UART 可变(T1溢出率)其中,fosc为振荡器的频率,UART为通用异步接收和发送器的英文缩写。
串行口工作方式0:当设定SM0、SM1为00时,串行口工作于方式0,它又叫同步移位寄存器输出方式。
在方式0下,数据从RXD(P3.0)端串行输出或输入,同步信号从TXD(P3.1)端输出,发送或接收的数据为8位,低位在前,高位在后,没有起始位和停止位。
数据传输率固定为振荡器的频率1/12,也就是每个机器周期传送一位数据。
方式0可以外接移位寄存器,将串行口扩展为并行口,也可以外接同步输入/输出设备。
执行任何一条以SBUF为目的寄存器指令,就开始发送。
串行口工作方式1:当设定SM0、SM1为01时,串行口工作于方式1,为数据传输率可变的8位异步通信方式,由TXD发送,RXD接收,一帧数据为10位,1位起始位(低电平),8位数据位(低位在前),1位停止位(高电平)。
数据传输率取决于定时器1或2的溢出速率(1/溢出周期)和数据传输率是否加倍的选择位SMOD。
对于有定时器/计数器2的单片机,当T2CON寄存器中RCLK和TCLK置位时,用定时器2作为接收和发送数据传输率发生器,而RCLK=TCLK=0时,用定时器1作为接收和发送的数据传输率发生器。
2个定时器/计数器可以交叉使用,即发送和接收采用不同的数据传输率。
发送过程是由执行任何一条以SBUF为目的的寄存器指令引起的。
串行口工作方式2:当设定SM0、SM12位为10时,串行口工作于方式2,此时串行口被定义为9位异步通信接口。
采用这种方式可接收或发送11位数据,以11位为一帧,比方式1增加了一个数据位,其余相同。
第9个数据即D8位可用作奇偶校验或地址/数据选择,可以通过软件来控制它,再加特殊功能寄存器SCON中的SM2位的配合,可使MCS-51单片机串行口适用于多机通信。
发送时,第9位数据为TB8,接收时,第9位数据送入RB8。
方式2数据传输率固定,只有2个选择,为振荡器的1/64或1/32,可由PCON的最高位选择。
串行口工作方式3:当设定SM0、SM1二位为11时,串行口工作于方式3。
方式3与方式2类似,唯一的区别是方式3的数据传输率是可变的,而帧格式与方式2一样为11位一帧。
方式3也适用于多机通信。
SM2:多机通信控制位多机通信时工作于方式2和方式3,SM2位主要用于方式2和方式3。
接收状态,当串行口工作于方式2或方式3,以及SM2=1时,只有当接收到第9位数据(RB8)为1时,才把接收到的前8位数据送入SBUF,且置位RI发出中断请求,否则会将接收到的数据放弃。
当SM2=0时,就不管第9位数据是0还是1,都将数据送入SBUF,并发出中断请求。
工作于方式0,SM2必须为0。
REN:允许接收位REN用于控制数据接收的允许和禁止,REN=1允许接收,REN=0禁止接收。
TB8:发送数据位8在方式2和方式3中,TB8是要发送的第9位数据位,在多机通信中同样需要传输这一位,TB8=0表示传输的为数据,TB8=1代表传输的为地址。
RB8:接收数据位8在方式2和方式3中,RB8存放接收到的第9位数据,用以识别接收到的数据特征。
TI:发送中断标志位可寻址标志位。
方式0时,发送完第8位数据后,由硬件置位,其他方式下,在发送或停止位之前由硬件置位,TI=1表示帧发送结束, 向CPU发中断申请。
在中断服务程序中,必须用软件将其清0,取消此中断申请。
RI:接收中断标志位可寻址标志位。
方式0时,接收完第8位数据后,该位由硬件置位,在其他工作方式下,该位由硬件置位,RI=1表示帧接收完成,向CPU发中断申请。
在中断服务程序中,必须用软件将其清0,取消此中断申请。
如何向串口发送数据,并接收串口发来的数据
现在的笔记本电脑是没有带串口的,所以注册的配置中是没有串口的,当然提示你打不开串口。
如果你在自己的电脑上实现数据传输,可以下载个虚拟串口的软件,自己建立一对连接起来的串口。
如果你要实现PC对目标机的发送,你可以去购买串口转USB的工具,安装相关驱动
串口助手向keil发串口数据
你应该是使用keil软件仿真,使用虚拟串口模拟串口收发数据的吧!如果要keil收到整帧的数据,那么把断点位置修改下,在接收缓存收完全部数据的时候软件设个标志,将断点设到标志后面,标志改变就进断点。
就可以收完整串数据了。
而如果在接收处设断点,每次收到一个数据就进断点,程序就停了。
还有就是必须有接收缓冲区,存储接收数据。
[求助]串口COM1无法发送数据?现象:一台台式机和一台笔记本电
展开全部 以下是我刚改的程序编译成功了请参考#include"reg51.h"//定义全局变量unsigned char data_10[10]={0,0,0,0,0,0,0,0,0,0}; unsigned char Time_50ms,count; bit flag=0;bit data_flag=0;/*********************************************************************************************函数名:UART串口初始化函数调 用:UART_init();参 数:无返回值:无结 果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)备 注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]/**********************************************************************************************/void UART_init (void){EA = 1; //允许总中断(如不使用中断,可用//屏蔽)ES = 1; //允许UART串口的中断TMOD |= 0x20;//定时器T/C1工作方式2SCON = 0x50;//串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)TH1 = 0xF3;//定时器初值高8位设置TL1 = 0xF3;//定时器初值低8位设置PCON = 0x80;//波特率倍频(屏蔽本句波特率为2400)TR1 = 1;//定时器启动 }/**********************************************************************************************//*********************************************************************************************函数名:UART串口接收中断处理函数调 用:[SBUF收到数据后中断处理]参 数:无返回值:无结 果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)备 注:过长的处理程序会影响后面数据的接收/**********************************************************************************************/void UART_R (void) interrupt 4 using 1{ //切换寄存器组到1TR0=1; //打开定时器开始计时RI = 0;//令接收中断标志位为0(软件清零)data_10[count] = SBUF;//将接收到的数据送入变量 UART_datacount++;//接收到一个字节数据计数+1if(count>=10) //如果接收到10个数据{TR0=0; //停止定时器TH0 = 0x3C; //给定时器赋初值TL0 = 0xB0; //给定时器赋初值count=0;//清零数据计数//data_flag=1; //数据有效标志位SBUF = 0x55;//返回数据 55Hwhile(TI == 0);//检查发送中断标志位TI = 0;//令发送中断标志位为0(软件清零)}if(flag){TR0=0; //停止定时器TH0 = 0x3C; //给定时器赋初值TL0 = 0xB0; //给定时器赋初值count=0;//清零数据计数SBUF = 0xff;//返回数据 ffHwhile(TI == 0);//检查发送中断标志位TI = 0;//令发送中断标志位为0(软件清零)}}/**********************************************************************************************//*********************************************************************************************函数名:定时/计数器初始化函数调 用:T_C_init();参 数:无返回值:无结 果:设置SFR中T/C1和(或)T/C0相关参数备 注:本函数控制T/C1和T/C0,不需要使用的部分可用//屏蔽/**********************************************************************************************/void T_C_init (void){TMOD |= 0x01; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]EA = 1;//中断总开关TH0 = 0x3C; //16位计数寄存器T0高8位TL0 = 0xB0; //16位计数寄存器T0低8位(0x3CB0 = 50mS延时)ET0 = 1; //T/C0中断开关TR0 = 0; //T/C0开关}/**********************************************************************************************//*********************************************************************************************函数名:定时/计数器0中断处理函数调 用:[T/C0溢出后中断处理]参 数:无返回值:无结 果:重新写入16位计数寄存器初始值,处理用户程序备 注:必须允许中断并启动T/C本函数方可有效,重新写入初值需和T_C_init函数一致/**********************************************************************************************/void T_C0 (void) interrupt 1 using 1{ //切换寄存器组到1TH0 = 0x3C; //16位计数寄存器T0高8位(重新写入初值)TL0 = 0xB0; //16位计数寄存器T0低8位(0x3CB0 = 50mS延时)Time_50ms++; //50ms到 计数+1if(Time_50ms>=100){Time_50ms=0;// 清零50ms计数flag=1; //5s时间 标志置位TR0=0;//关闭计时器}}/**********************************************************************************************/main(){IP = 0x10; //中断优先级设置(串口中断最高优先级)UART_init();//初始化串口T_C_init(); // 初始化计数器while(1);// 空循环}希望能解决您的问题。