我的任务是通过RS485 2线系统实现ModBus协议 . (实际上它是三根线,A / B和GND) . 虽然ModBus不是重点,但是之前的步骤......界面上的简单I / O.

我正在使用FTDI USB-RS485转换器将Linux主机(不可互换)连接到Windows主机(可与其他Linux主机互换,但我想避免这种情况)

编码应该是19200,8,n,1 . 但它似乎不起作用 .

我没有准确的代码,但在Linux上我这样做:

int fd = open("/dev/ttyS3", O_RDWR | O_CTTY);

if(fd == -1) return "Error while opening the port";

接下来,我配置端口 .

struct termios tty;

tcgetattr(fd, &tty);

cfsetispeed(&tty, B19200);

cfsetospeed(&tty, B19200);

tty.c_cflag = CS8; //Empties the cflags and sets the character width.

tty.c_cflag |= (CLOCAL | CREAD); //Sets 'recommended' options.

tty.c_lflag = 0;

tty.c_iflag = 0;

tty.c_oflag = 0;

tcgetattr(fd, TCSANOW, &tty);

奇偶校验和流量控制目前尚未规划,因为最终结果将连接到低级别的电路板,我需要自己处理信号 . 此外,没有任何电线可以实现“不受约束的通信” . (毕竟我不希望XON / XOFF字符限制我可以传输的字节范围)

所有这些功能都能正常运行并设置数据 .

在Windows上,我打开这样的串口:

DCB SP;

HANDLE hSerial = CreateFile("COM6", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

if(hSerial == INVALID_HANDLE_VALUE) return "Error while opening the port";

GetCommState(hSerial, &SP);

奇偶校验被禁用,以及流量控制 . 字节大小设置为8 .

编辑:因为已经被问到,这是我的Windows上的波特率代码(来自内存)SP.DCBlength = sizeof(SP); SP.BaudRate = 19200; SP.Parity = NOPARITY; SP.StopBits = ONESTOPBIT; SetCommState(hSerial,&SP);

同样,所有这些功能都运行得很完美 .

现在,对于让我头疼的测试用例 .

在Linux主机上,我创建了一个256字节大小的字节缓冲区 . 该缓冲区填充0-255的字符值...然后通过写入发送 . 与此同时,另一方正在等待“ReadFile”数据到达 .

使用此配置,对于“其他Linux主机”以及Windows主机,256字节到达...但是它不是0-255的数字,而是00 06等 .

当我在设置我真正想要的选项之前将termios结构的所有成员设置为0时,我可以让Linux主机工作 . 我猜,这是因为控制字符...但是如果我这样做,Windows主机要么只接收256个字节中的4个 .

正如我所说,不幸的是我没有方便的代码 . 如果有人知道我能从哪个方面解决这个问题,我将非常感激 . 一旦我再次访问它,我将发布更多代码 .

我是如何实现读取操作的:

DWORD nBytes = 0;

char Buffer[256], *ptr = Buffer;

int Rem = 256;

while(Rem) {

ReadFile(hSerial, ptr, Rem, &nBytes, 0);

Rem -= nBytes;

ptr += nBytes;

}

//Evaluate Buffer

需要注意的是,我确实设置了超时,但不记得确切的值 .

编辑:因为我现在可以再次访问我的工作地点,这是实际(当前)代码 .

const char *InitCOM(const char *TTY) {

struct termios tty;

hSerial = open(TTY, O_RDWR | O_NOCTTY | O_NDELAY);

if(hSerial == -1) return "Opening of the port failed";

fcntl(hSerial, F_SETFL, 0);

if(tcgetattr(hSerial, &tty) != 0) return "Getting the parameters failed.";

if(cfsetispeed(&tty, B19200) != 0 || cfsetospeed(&tty, B19200) != 0) return "Setting the baud rate failed.";

//CFlags

//Note: I am full aware, that there's an '=', and that it makes the '&=' obsolete, but they're in there for the sake of completeness.

tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; //8-bit characters

tty.c_cflag |= (CLOCAL | CREAD);und erlaubt 'Lesen'.

tty.c_cflag &= ~(PARENB | PARODD);

tty.c_cflag &= ~CSTOPB;

tty.c_cflag &= ~CRTSCTS;

//Input Flags

tty.c_iflag &= ~IGNBRK;

tty.c_iflag &= ~(IXON | IXOFF | IXANY);

//Local Flags

tty.c_lflag = 0;

//Output Flags

tty.c_oflag = 0;

//Control-Characters

tty.c_cc[VMIN] = 0;

tty.c_cc[VTIME] = 5;

if(tcsetattr(hSerial, TCSAFLUSH, &tty) != 0) return "Setting the new parameters failed";

return NULL;

}

至于实际的发送/接收代码:

int main(int argc, char* argv[]) {

#if defined FOR_PC

const char *err = InitCOM("/dev/ttyUSB0");

#else

const char *err = InitCOM("/dev/ttyS3");

#endif

if(err) printf("Error while initalizing: %s ErrNum: %d\n", err, errno);

else {

/*unsigned char C[256]; //Original code with the array

int nBytes;

#ifdef FOR_PC

int Rem = 256, ReqCount = 0;

unsigned char *ptr = C;

while(Rem > 0) {

fd_set fds;

FD_ZERO(&fds);

FD_SET(hSerial, &fds);

select(hSerial+1, &fds, NULL, NULL, NULL);

nBytes = read(hSerial, ptr, Rem);

if(nBytes > 0) {

Rem -= nBytes;

ptr += nBytes;

++ReqCount;

}

}

printf("Number of received Bytes: %d in %d sends.\n\n", 256 - Rem, ReqCount);

for(int i = 0; i < 256; ++i) {

printf("%02X ", C[i]);

if((i%32) == 31) printf("\n");

}

#else

for(int i = 0; i < 256; ++i) C[i] = i;

nBytes = write(hSerial, C, 256);

printf("\nWritten Bytes: %d\n", nBytes);

#endif*/

//Single-Byte Code

unsigned char C = 0x55;

#ifdef FOR_PC

while(true) { //Keeps listening

fd_set fds;

FD_ZERO(&fds);

FD_SET(hSerial, &fds);

select(hSerial+1, &fds, NULL, NULL, NULL);

read(hSerial, &C, 1);

printf("Received value 0x%02X\n", C);

}

#else

write(hSerial, &C, 1); //Sends one byte

#endif

close(hSerial);

}

return 0;

}

至于示波器:我已经通过发送测试了两个方向 . 他们的工作非常令人钦佩 .

0x55的信号是50微秒长度的常数上/下(应该如此,所以设置波特率也没问题) .

那么我的'接收'代码中有什么东西我做错了吗? '选择'错了吗?

rs485编程java_串行编程RS485相关推荐

  1. Storm之——流组件简单串行编程实践

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/78447229 Storm是一个分布式是实时计算系统,它设计了一种对流和计算的抽象, ...

  2. PIC单片机在线串行编程(ICSP)的实现

    ICSP(In-Circuit Serial Programming)即在线串行编程,通过保持RB6和RB7引脚为低电平,VDD 为编程电压,并将MCLR(VPP)引脚电压从VIL增加到VIHH,器件 ...

  3. pic10f220 c语言,PIC10F202高性能8位全静态闪存CMOS微控制电路串行编程(ICSP™)功能...

    是一款低成本,高性能,8位,全静态, 基于闪存的cmos微控制器. 它采用risc架构, 只有33个单字/单周期指令. 除程序分支外, 所有指令均为单周期(1μs), 程序分支需要两个周期. 它提供的 ...

  4. 串行通讯RS485 Modbus RTU协议控制

    一.内容简介 本文主要介绍欧姆龙CP1E做上位与SMC的LECP6电缸 之间串行通讯RS485 Modbus RTU协议程序控制说明. 二.设备简介         硬件:CP1E.CP1W-CIF1 ...

  5. 告别ASP(主动串行编程)下载模式

    告别ASP(主动串行编程)下载模式 --JTAG---EPCS1 序 一直以来,一般人下载FPGA 的配置芯片,都是用ASP下载模式,USB Blaster接口要插来插去,真的是麻烦,其实,下载FPG ...

  6. 串行协议--RS-485协议

    RS-485多机通信的组网方式 典型的总线式通信方式 菊花链式多机通信方式 每个节点智能接收上个节点发送的数据,只能向下一个节点发送数据. 星形RS-485多机通信方式 要实现星形组网方式,必须使用R ...

  7. C++串行编程步骤介绍

    (一) 串口的参数设置及打开   对RS-232-C串行端口进行参数配置是使用串口进行通讯的必要条件.而且由于场合不同.用途.功能的不同对串口也采取不同的配置方式,为了使本程序更灵活,适应面更广,采取 ...

  8. protues仿真中12864液晶屏串行编程的感想(从实际硬件驱动芯片 ST7565R到仿真硬件驱动芯片SED1565)

    因为疫情的原因,没办法回学校拿毕业设计,自然也就没办法调试,虽然硬件电路都搭好了,但没法调试也就意味着不知道程序编写是否有问题,所以就想着在protues上把硬件电路搭起来调试程序,因为单片机用的是s ...

  9. AD9910高速集成DDS芯片(芯片阅读笔记-串行模式篇-22个寄存器SPI通信周期控制)

    文章目录 引言 串行编程 利用官方软件得到寄存器值 福利连接 引言 本文为AD9910的芯片阅读笔记,本文并不是对芯片手册的纯粹照搬,所以建议结合芯片手册阅读.通过对AD9910芯片手册的理解,然后再 ...

最新文章

  1. java io在文件结尾持续添加内容
  2. numpy.where用法
  3. python环境搭建_搭建Python编程环境
  4. 2020-11-9(有序和无序广播)
  5. 爱情麻辣烫:浓缩了中华美食精华与火锅的精髓
  6. ABAP代码静态分析工具SQF - Support Query Framework
  7. mysql 压缩备份_备份压缩mysql 数据库
  8. 交换机 路由器 OSI7层模型
  9. MySql Binlog初识
  10. PHP与JS互相加密解密方法2.0
  11. php将数组打印到txt文件
  12. 干货分享:PDF分割合并工具免费哪个好用?
  13. kinectfusion解析_KinectFusion解析
  14. photoshop cs4 注册
  15. alc662声卡注入id_ALC662声卡Linux提取文件.doc
  16. 多表古典密码统计分析
  17. linux分区btrfs,系统基础之Btrfs文件系统详解
  18. 怎么删除电脑上的另一个用户名?删除电脑上多余的用户名
  19. [案例分享]根据现有产品数据,如何做一次数据分析呢?
  20. hanoi塔问题解析(一) c++实现

热门文章

  1. OpenCV学习笔记之改变图像的对比度和亮度
  2. LINUX设备模型BUS,DEVICE,DRIVER
  3. python三大神器===》装饰器
  4. Mongodb数据库连接
  5. openstack基于mysql的问题修复
  6. 图片轮播,纯js+css
  7. Linux下挂载ISO文件
  8. linux下系统安全常见问题2
  9. 详细分析Memcached缓存与Mongodb数据库的优点与作用
  10. 【JavaScript】实现将从Excel中复制的数据粘贴到WEB页面Grid中