rs485 working again. had to add termios stuff and set baud

stable
Penguin
parent f7fc00d5c0
commit 26fe06fcc7

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -31,11 +31,11 @@
"-Icfg",
"-Iinc",
"-o",
"build/p_idp.o",
"src/p_idp.cpp"
"build/p_serial_packet.o",
"src/p_serial_packet.cpp"
],
"directory": "/storage/Shared/Projects/Penguinator/pi_serial_bus_manager",
"file": "src/p_idp.cpp"
"file": "src/p_serial_packet.cpp"
},
{
"arguments": [
@ -69,10 +69,10 @@
"-Icfg",
"-Iinc",
"-o",
"build/p_serial_packet.o",
"src/p_serial_packet.cpp"
"build/p_idp.o",
"src/p_idp.cpp"
],
"directory": "/storage/Shared/Projects/Penguinator/pi_serial_bus_manager",
"file": "src/p_serial_packet.cpp"
"file": "src/p_idp.cpp"
}
]

@ -1,18 +1,22 @@
#ifndef __P_SERIAL_BUS_H__
#define __P_SERIAL_BUS_H__
#include "p_serial_packet.h"
#include <linux/serial.h>
#include <termio.h>
class ps_bus
{
public:
ps_bus(const char* dev);
~ps_bus();
void ps_bus_start();
bool send_pkt(const ps_packet* const pkt);
bool recv_pkt(ps_packet* const pkt);
private:
struct serial_rs485 rs485conf;
int dev_fd;
struct termios toptions;
};
void p_sbus_start(void);
#endif

@ -19,38 +19,46 @@ void sigint_handler(int param)
{
b_quit = true;
std::cout << "Exiting..." << std::endl;
return;
}
int main()
{
signal(SIGINT, sigint_handler);
ps_bus sbus(SERIAL_DEV);
zmq::context_t ctx;
zmq::socket_t sub(ctx, ZMQ_SUB);
sub.connect(ZMQ_IPC_ADDR);
sub.setsockopt(ZMQ_SUBSCRIBE, "", 0);
zmq::message_t msg_recv;
zmq::message_t msg_send;
while (!b_quit)
{
zmq::message_t msg_recv;
int32_t x = 0;
int32_t y = 0;
if (sub.recv(&msg_recv, 0))
try
{
uint8_t xy[64];
memset(xy, 0, 64);
memcpy(xy, msg_recv.data(), msg_recv.size());
sscanf((const char*)xy, "X:%" PRId32 " Y:%" PRId32 "\n", &x, &y);
ps_packet xy_packet = ps_packet::from_xy(x, y);
xy_packet.encode();
xy_packet.show_packet();
for (size_t ind = 0; ind < xy_packet.msg_len; ind++)
if (sub.recv(&msg_recv, 0))
{
printf("[%lu]: %02x ", ind, xy_packet.data[ind]);
uint8_t xy[64];
memset(xy, 0, 64);
memcpy(xy, msg_recv.data(), msg_recv.size());
sscanf((const char*)xy, "X:%" PRId32 " Y:%" PRId32 "\n", &x,
&y);
ps_packet xy_packet = ps_packet::from_xy(x, y);
xy_packet.encode();
// xy_packet.show_packet();
if (!sbus.send_pkt(&xy_packet))
{
printf("Some failure on transmission\n");
}
}
printf("\n");
}
catch (zmq::error_t& e)
{
std::cout << e.what() << std::endl;
}
}

@ -2,8 +2,6 @@
#include <cstring>
#include <errno.h>
#include <fcntl.h>
#include <iostream>
#include <linux/serial.h>
#include <stdio.h>
#include <unistd.h>
@ -13,15 +11,16 @@
ps_bus::ps_bus(const char* dev)
{
/* Open your specific device (e.g., /dev/mydevice): */
int fd = open(dev, O_RDWR);
if (fd < 0)
printf("%s\n", dev);
dev_fd = open(dev, O_RDWR | O_NOCTTY);
if (dev_fd < 0)
{
/* Error handling. See errno. */
fprintf(stderr, "Creation of the bus failed... error: %s",
strerror(errno));
exit(1);
}
struct serial_rs485 rs485conf;
memset(&rs485conf, 0, sizeof(rs485conf));
/* Enable RS485 mode: */
rs485conf.flags |= SER_RS485_ENABLED;
@ -29,10 +28,10 @@ ps_bus::ps_bus(const char* dev)
/* Set logical level for RTS pin equal to 1 when sending: */
rs485conf.flags |= SER_RS485_RTS_ON_SEND;
/* or, set logical level for RTS pin equal to 0 when sending: */
rs485conf.flags &= ~(SER_RS485_RTS_ON_SEND);
// rs485conf.flags &= ~(SER_RS485_RTS_ON_SEND);
/* Set logical level for RTS pin equal to 1 after sending: */
rs485conf.flags |= SER_RS485_RTS_AFTER_SEND;
// rs485conf.flags |= SER_RS485_RTS_AFTER_SEND;
/* or, set logical level for RTS pin equal to 0 after sending: */
rs485conf.flags &= ~(SER_RS485_RTS_AFTER_SEND);
@ -40,15 +39,36 @@ ps_bus::ps_bus(const char* dev)
// rs485conf.delay_rts_before_send = ...;
// /* Set rts delay after send, if needed: */
// rs485conf.delay_rts_after_send = ...;
// rs485conf.delay_rts_after_send = 10;
/* Set this flag if you want to receive data even while sending data */
// rs485conf.flags |= SER_RS485_RX_DURING_TX;
if (ioctl(fd, TIOCSRS485, &rs485conf) < 0)
if (ioctl(dev_fd, TIOCSRS485, &rs485conf) < 0)
{
printf("ERROR\n");
/* Error handling. See errno. */
}
memset(&toptions, 0, sizeof(toptions));
tcgetattr(dev_fd, &toptions);
toptions.c_cflag &= ~(CSIZE | PARENB);
// enable receiver
toptions.c_cflag |= CREAD;
// 8 data bit
toptions.c_cflag |= CS8;
// Ignore framing errors and parity errors
toptions.c_lflag &= ~(ICANON);
toptions.c_lflag &= ~(ECHO);
toptions.c_lflag &= ~(ECHOE);
// disable signal chars
toptions.c_lflag &= ~(ISIG);
// set baud rate
cfsetspeed(&toptions, B115200);
// flush cache
tcflush(dev_fd, TCIFLUSH);
// apply
tcsetattr(dev_fd, TCSANOW, &toptions);
}
ps_bus::~ps_bus()
@ -60,5 +80,17 @@ ps_bus::~ps_bus()
}
}
void ps_bus::ps_bus_start()
{}
bool ps_bus::send_pkt(const ps_packet* const pkt)
{
bool ret = true;
if (write(dev_fd, pkt->data, pkt->msg_len) != pkt->msg_len)
{
ret = false;
}
return ret;
}
bool ps_bus::recv_pkt(ps_packet* const pkt)
{
bool ret = true;
return ret;
}

Loading…
Cancel
Save