哪一款rs232串口通讯调试软件好
这一般的调试软件是不具备的,就必须下载具有这些功能 的调试软件了。
所以,只是在调试时用一会,方便了就是了。
但,要求通信时,有校验功能的或其它特殊要求的,又不是长久使用。
无所谓好坏,只要能方便调试程序就行,只要你用习惯了网上的rs232串口通讯调试软件确实很多,但都差不多...
求一个用java写的串口通信软件,界面如图所示
#include #include #define uchar unsigned char #define uint unsigned intsbit LCD_RS = P2^0; sbit LCD_RW = P2^1;sbit LCD_EN = P2^2;#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};uchar data RXDdata[ ] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20 };uchar temp,buf,m,count;bit playflag=0;uchar code cdis1[ ] = {" SERILA TRANFER "};uchar code cdis2[ ] = {" "};/********************************************************** 延时子程序**********************************************************/char code SST516[3] _at_ 0x003b;void delay1(uint ms) { uchar k; while(ms--) { for(k = 0; k < 120; k++); }}/******************************************************************//* *//*检查LCD忙状态 *//*lcd_busy为1时,忙,等待。
lcd-busy为0时,闲,可写指令与数据。
*//* *//******************************************************************/ bit lcd_busy() { bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP(); result = (bit)(P0&0x80); LCD_EN = 0; return(result); }/*******************************************************************//* *//*写指令数据到LCD *//*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
*//* *//*******************************************************************/void lcd_wcmd(uchar cmd){ while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; }/*******************************************************************//* *//*写显示数据到LCD *//*RS=H,RW=L,E=高脉冲,D0-D7=数据。
*//* *//*******************************************************************/void lcd_wdat(uchar dat){ while(lcd_busy()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; }/*******************************************************************//* *//* LCD初始化设定 *//* *//*******************************************************************/void lcd_init(){ delay1(15); lcd_wcmd(0x01); //清除LCD的显示内容 lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据 delay1(5); lcd_wcmd(0x38); delay1(5); lcd_wcmd(0x38); delay1(5); lcd_wcmd(0x0c); //开显示,显示光标,光标闪烁 delay1(5); lcd_wcmd(0x01); //清除LCD的显示内容 delay1(5);}/*******************************************************************//* *//* 设定显示位置 *//* *//*******************************************************************/void lcd_pos(uchar pos){ lcd_wcmd(pos | 0x80); //数据指针=80+地址变量}/********************************************************* 发送数据函数*********************************************************/void senddata(uchar dat){ SBUF =dat; while(!TI); TI = 0;}/********************************************************* 串行中断服务函数*********************************************************/void serial() interrupt 4 { ES = 0; //关闭串行中断 RI = 0; //清除串行接受标志位 buf = SBUF; //从串口缓冲区取得数据 playflag=1; switch(buf) { case 0x31: senddata('X');break; //接受到1,发送字符'W'给计算机 case 0x32: senddata('L');break; //接受到2,发送字符'I'给计算机 case 0x33: senddata('1');break; //接受到3,发送字符'L'给计算机 case 0x34: senddata('0');break; //接受到4,发送字符'L'给计算机 case 0x35: senddata('0');break; //接受到5,发送字符'A'给计算机 case 0x36: senddata('0');break; //接受到5,发送字符'R'给计算机 default: senddata(buf);break; //接受到其它数据,将其发送给计算机 } if(buf!=0x0D) { if(buf!=0x0A) { temp =buf; if(count<16) { RXDdata[count]=temp; count++; } } } ES = 1; //允许串口中断}/********************************************************* 数据显示函数*********************************************************/void play(){ if(playflag) { lcd_pos(0x40); //设置位置为第二行 for(m=0;m<16;m++) lcd_wdat(cdis2[m]); //清LCD1602第二行 for(m=0;m<16;m++) { lcd_pos(0x40+m); //设置显示位置为第二行 lcd_wdat(RXDdata[m]); //显示字符 } playflag=0; count=0x00; for(m=0;m<16;m++) RXDdata[m]=0x20; //清显存单元 } }/********************************************************* 主函数*********************************************************/void main(void) { P0 = 0xff; P2 = 0xff; SCON=0x50; //设定串口工作方式 PCON=0x00; //波特率不倍增 TMOD=0x20; //定时器1工作于8位自动重载模式, 用于产生波特率 EA=1; ES = 1; //允许串口中断 TL1=0xf3; TH1=0xf3; //波特率2400 TR1=1; lcd_init(); lcd_pos(0x00); //设置显示位置为第一行 for(m=0;m<16;m++) lcd_wdat(cdis1[m]); //显示字符 lcd_pos(0x40); //设置显示位置为第二行 for(m=0;m<16;m++) lcd_wdat(cdis2[m]); //显示字符 while(1) { play(); }}这个串口通信程序在我的开发版上已经全部验证通过,你可以根据实际,攸 改里面某些参数,满足你自己的需要就行。
比如你你点亮小灯,这部分你只可在相应位置添加代码...
为什么会出现串口通信,I2C通信,SPI通信,UART通信等等这么多...
1、串口通信协议。
串口是计算机上一种非常通用的设备通信协议(不要与通用串行总线Universal SerialBus或者USB混淆)。
大多数计算机包含两个基于RS232的串口。
串口同时也是仪器仪表设备通用的通信接口;很多GPIB兼容的设备也带有RS-232口。
同时,串口通信协议也可以用于获取远程采集设备的数据。
串口通信的概念非常简单,串口按位(bit)发送和接收字节。
尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。
它很简单并且能够实现远距离通信。
比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。
典型地,串口用于ASCII码字符的传输。
通信使用3根线完成:(1)地线,(2)发送,(3)接收。
由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。
其他线用于握手,但是不是必须的。
串口通信最重要的参数是比特率、数据位、停止位和奇偶校验。
对于两个进行通信的端口,这些参数必须匹配:a,比特率:这是一个衡量通信速度的参数。
它表示每秒钟传送的bit的个数。
例如300波特表示每秒钟发送300个bit。
当我们提到时钟周期时,就是指比特率,例如如果协议需要4800波特率,那么时钟是4800Hz。
这意味着串口通信在数据线上的采样率为4800Hz。
通常电话线的比特率为14400,28800和36600。
比特率可以远远大于这些值,但是波特率和距离成反比。
高比特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。
b,数据位:这是衡量通信中实际数据位的参数。
当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。
如何设置取决于你想传送的信息。
比如,标准的ASCII码是0~127(7位)。
扩展的ASCII码是0~255(8位)。
如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。
每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。
由于实际数据位取决于通信协议的选取,术语"包"指任何通信的情况。
c,停止位:用于表示单个包的最后一位。
典型的值为1,1.5和2位。
由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。
因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。
适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
d,奇偶校验位:在串口通信中一种简单的检错方式。
有四种检错方式:偶、奇、高和低。
当然没有校验位也是可以的。
对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。
例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。
如果是奇校验,校验位为1,这样就有3个逻辑高位。
高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。
这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。
2、I2C通信协议。
工作速率有100K和400K两种; 支持多机通讯; 支持多主控模块,但同一时刻只允许有一个主控; 由数据线SDA和时钟SCL构成的串行总线; 每个电路和模块都有唯一的地址; 每个器件可以使用独立电源二. 基本工作原理: 以启动信号START来掌管总线,以停止信号STOP来释放总线; 每次通讯以START开始,以STOP结束; 启动信号START后紧接着发送一个地址字节,其中7位为被控器件的地址码,一位为读/写控制位R/W,R. /W位为0表示由主控向被控器件写数据,R/W为1表示由主控向被控器件读数据; 当被控器件检测到收到的地址与自己的地址相同时,在第9个时钟期间反馈应答信号; 每个数据字节在传送时都是高位(MSB)在前;写通讯过程: 1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线; 2. 发送一个地址字节(包括7位地址码和一位R/W); 3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK); 4. 主控收到ACK后开始发送第一个数据字节; 5. 被控器收到数据字节后发送一个ACK表示继续传送数据,发送NACK表示传送数据结束; 6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线;读通讯过程: 1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线; 2. 发送一个地址字节(包括7位地址码和一位R/W); 3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK); 4. 主控收到ACK后释放数据总线,开始接收第一个数据字节; 5. 主控收到数据后发送ACK表示继续传送数据,发送NACK表示传送数据结束; 6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线;四. 总线信号时序分析 1. 总线空闲状态 SDA和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线,两条信号线各自的上拉电阻把电平拉高; 2. 启动信号START 时钟信号SC...
rs232串口通信,各位大神速度吧
既然使用了232,那么自然就说明数据传输是有限制的,读取主程序???汇编的概念中,232是这个中断信号,主程序会“优先”帮你处理232上面的数据,至于怎处理,那要看程序员如何写代码,比如,他说你发送个“0x0f”给我,我就告诉你主程序内容???别多想了,换成是你写这个程序,也不会把FLASH中的内容发送出去的。
不过也有办法,很复杂,需要用芯片擦写工具……首先你要先把芯片从设备上拆下来,根据芯片定义接入擦写引脚,比如JTAG、ISP等,再用特殊的软件读取芯片内容…………(还是找破解高手吧,听说为了读取芯片内容,有的芯片要被激光切割呢……别多想了)那么你想编写驱动程序?这个比较简单。
联系一下供应商,让他们提供给你动态库,以及动态库的功能函数说明手册,利用这个,你能在C/C++语言等常用的语言中调用,并通过232控制设备了。
当然这些动态库中的内容你仍然是不能了解的,你所能掌握的,就是如何去使用别人写的东西,毕竟驱动程序是别人开发的,而动态库就是提供给你去指挥驱动程序运行的。
如果供应商提供给你一些驱动的指令字符串,那就更好了,因为你可以使用“串口调试助手”,直接发送这些指令字符串,直接控制设备,例如:有个设备这样运行,通过232接收指令:用“串口调试助手”发送,0x01表示前进;0x02表示后退;0x03表示旋转;0x04表示向上;0x05表示下降……等等;如果要写成程序,windows有动态库提供串口驱动,你可以在C/C++语言中调用,然后把发送内容写进去就行了。
单片机串口通信
2种不同的通讯接口,串口调试助手用的是UART通讯协议,I2C是另外一种通讯协议,2种完全不兼容,I2C一般用在设备内部各个集成电路之间的通讯,因为无法远距离的传输才限制了它的应用场合,UART就不同了,比较广泛。
如果想用串口调试助手,那你要看目标设备有没有UART接口了,如果你想用串口调试助手调试I2C接口,那你只能用单片机做个通讯接口转换了,一般单片机都带有UART接口,另外一端如果单片机自带I2C接口那就好,没有的话也可以通过IO口模拟出来,还有I2C不是仅仅限制于EEPROM的通讯,很多其他的集成电路用的也是I2C通讯接口,比如传感器等等集成电路。
另外你可能会遇到另外一个概念RS232,这个和UART是同一种通讯协议,只是电平不同罢了。
。
。
Modbus协议和串口通讯协议
所谓协议是双方通信的约定,是一串有格式的字节数组。
Modbus协议是标准,严格定义了通信双方的通信规范,有串口部分和TCP部分,格式不一样。
串口通信协议是一个泛指。
至于RS232和RS485,是无软件干预的硬件规范,软件人员可以不管,通信上都是串行通信,串口软件不必区分。
可以用流行的协议类软件,如格西烽火等,进行学习和测试。
MATLAB串口通信示例程序
1)需要一个串口通信用软件,比如Commix软件。
2)需要有PC机与外部设备通信的数据线(两头都是母接口的9针RS232口),并连接好PC机和外部设备。
3)需要有与外部设备的通信协议和指令,设置好PC机的COM口号,波特率,数据位,检验位等参数,打开串口后,按通信协议规约的指令在窗口输入指令,点发送。
如果对就能从接收数据窗接收外部设备返回的数据。