I reported here:
https://bugreports.qt-project.org/browse/QTBUG-38305
But just migrate my APP to ANSI C and is exactly the same.
My code test in ANSI C:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <pthread.h>
#include <stdlib.h>
#include <time.h>
#define STX (0x02)
#define ETX (0x03)
#define ENQ (0x05)
#define ACK (0x06)
#define NAK (0x15)
#define SEP (0x0A)
int serial = -1;
int finnish = 0;
char *buffer = NULL;
size_t buffer_size = 0;
size_t buffer_len = 0;
const char enq[1] = {ENQ};
const char ack[1] = {ACK};
const char nak[1] = {NAK};
pthread_cond_t buffer_no_empty = PTHREAD_COND_INITIALIZER;
pthread_mutex_t buffer_mutex = PTHREAD_MUTEX_INITIALIZER;
static void debug_str(const char *str, size_t size) {
int i;
for(i = 0; i < size; ++i)
if(isprint(str[i]) && !iscntrl(str[i]))
printf("%c", (char)str[i]);
else
printf(" 0x%02X ", (unsigned char) str[i]);
printf("\n");
}
static void flush() {
if(serial<0) return;
tcflush(serial, TCIFLUSH);
tcflush(serial, TCIOFLUSH);
tcflush(serial, TCOFLUSH);
}
static void openPort(const char *port) {
serial = open(port, O_RDWR | O_NOCTTY | O_NONBLOCK);
if(serial<0) {
printf("Error %u from serial open: %s\n", errno,
strerror(errno));
return ;
}
struct termios tty;
memset(&tty, 0, sizeof(tty));
// Set Baud Rate
cfsetospeed (&tty, B9600);
cfsetispeed (&tty, B9600);
tty.c_cflag |= PARENB;
tty.c_cflag &= ~(PARODD | CSTOPB | CSIZE);
tty.c_cflag |= CS8;
tty.c_cflag |= CLOCAL;
tty.c_cflag |= CREAD;
tty.c_iflag |= (IXON | IXOFF | IXANY);
flush();
if ( tcsetattr(serial, TCSANOW, &tty) != 0 )
printf("Error %d from tcsetattr: %s\n", errno, strerror(errno));
flush();
}
#define valid_buffer() (buffer_size>3 && buffer[0]==STX &&
buffer[buffer_size-2] == ETX)
static void* thread_read(void* dummy) {
unsigned char buf;
while(!finnish) {
int n = read(serial, &buf, 1);
if(n>0) {
pthread_mutex_lock(&buffer_mutex);
if(buf == ENQ) {
printf("Recive ENQ, sending ACK\n");
write(serial, ack, 1);
pthread_mutex_unlock(&buffer_mutex);
continue;
}
if(buffer_size == buffer_len) {
buffer_len *= 2;
buffer = realloc(buffer, (size_t)buffer_len);
}
buffer[buffer_size] = buf;
buffer_size += 1;
printf("Buffer: ");
debug_str(buffer, buffer_size);
if(valid_buffer()) {
printf("Signal buffer_no_empty\n");
pthread_cond_signal(&buffer_no_empty);
}
pthread_mutex_unlock(&buffer_mutex);
}else if(n<0 && errno!=11) {
printf("Error %d from serial read: %s\n", errno,
strerror(errno));
}
}
return NULL;
}
static void send_and_read(const char *data, size_t size, int
timeout, char **recv, size_t *size_recv) {
printf("Write: ");
debug_str(data, size);
write(serial, data, size);
time_t startTime = time(NULL);
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += timeout;
printf("Wait response...\n");
pthread_mutex_lock(&buffer_mutex);
while(!valid_buffer() && time(NULL)-startTime<timeout-1)
pthread_cond_timedwait(&buffer_no_empty, &buffer_mutex, &ts);
if(valid_buffer()) {
*recv = malloc(buffer_size+1);
*size_recv = buffer_size;
memcpy(*recv, buffer, buffer_size);
(*recv)[buffer_size]='\0';
printf("Read:");
debug_str(*recv, buffer_size);
}else{
printf("Timeout...\n");
*recv = NULL;
*size_recv = 0;
}
buffer_size = 0;
memset(buffer, 0, buffer_len);
pthread_mutex_unlock(&buffer_mutex);
}
int main(){
openPort("/dev/ttyUSB0");
if(serial>0) {
buffer = malloc(1024);
buffer_len = 1024;
pthread_t thread;
pthread_create(&thread, NULL, thread_read, NULL);
char *test = NULL;
size_t s = 0;
send_and_read(enq, 1, 15, &test, &s);
if(s>0)
printf("Test status: OK\n");
else
printf("Test status: Fail\n");
sleep(3); //Pause...
char command[5] = {STX, 'S', '1', ETX, 'a'};
send_and_read(command, 5, 15, &test, &s);
if(s>0)
printf("Test command: OK\n");
else
printf("Test command: Fail\n");
finnish = 1;
void *dummy;
pthread_join(thread, &dummy);
close(serial);
free(buffer);
}
}
My Log of APP:
Write: 0x05
Wait response...
Buffer: 0x02
Buffer: 0x02 `
Buffer: 0x02 `@
Buffer: 0x02 `@ 0x03
Buffer: 0x02 `@ 0x03 #
Signal buffer_no_empty
Read: 0x02 `@ 0x03 #
Test status: OK
Write: 0x02 S1 0x03 a
Wait response...
Timeout...
Test command: Fail
My syslog:
Apr 14 00:09:44 kali kernel: [14827.112964] tty ttyUSB0: serial_open
Apr 14 00:09:44 kali kernel: [14827.112981] usb 1-1:
ch341_control_in(c0,5f,0000,0000,ef484b00,8)
Apr 14 00:09:44 kali kernel: [14827.114572] usb 1-1:
ch341_control_out(40,a1,0000,0000)
Apr 14 00:09:44 kali kernel: [14827.115557] usb 1-1:
ch341_control_out(40,9a,1312,b202)
Apr 14 00:09:44 kali kernel: [14827.116592] usb 1-1:
ch341_control_out(40,9a,0f2c,000c)
Apr 14 00:09:44 kali kernel: [14827.117595] usb 1-1:
ch341_control_in(c0,95,2518,0000,ef484b00,8)
Apr 14 00:09:44 kali kernel: [14827.118579] usb 1-1:
ch341_control_out(40,9a,2518,0050)
Apr 14 00:09:44 kali kernel: [14827.119572] usb 1-1:
ch341_control_in(c0,95,0706,0000,ef484a40,8)
Apr 14 00:09:44 kali kernel: [14827.120608] usb 1-1:
ch341_control_out(40,a1,501f,d90a)
Apr 14 00:09:44 kali kernel: [14827.121572] usb 1-1:
ch341_control_out(40,9a,1312,b202)
Apr 14 00:09:44 kali kernel: [14827.122569] usb 1-1:
ch341_control_out(40,9a,0f2c,000c)
Apr 14 00:09:44 kali kernel: [14827.123566] usb 1-1:
ch341_control_out(40,a4,ff9f,0000)
Apr 14 00:09:44 kali kernel: [14827.124602] usb 1-1:
ch341_control_in(c0,95,0706,0000,ef484a40,8)
Apr 14 00:09:44 kali kernel: [14827.125572] usb 1-1:
ch341_control_out(40,a4,ff9f,0000)
Apr 14 00:09:44 kali kernel: [14827.126567] usb 1-1:
ch341_control_out(40,9a,1312,b202)
Apr 14 00:09:44 kali kernel: [14827.127566] usb 1-1:
ch341_control_out(40,9a,0f2c,000c)
Apr 14 00:09:44 kali kernel: [14827.128597] ch341-uart ttyUSB0:
ch341_open - submitting interrupt urb
Apr 14 00:09:44 kali kernel: [14827.128649] usb 1-1:
ch341_control_out(40,a4,ff9f,0000)
Apr 14 00:09:44 kali kernel: [14827.129658] tty ttyUSB0:
serial_ioctl - cmd 0x540b
Apr 14 00:09:44 kali kernel: [14827.129678] tty ttyUSB0:
serial_ioctl - cmd 0x540b
Apr 14 00:09:44 kali kernel: [14827.129691] tty ttyUSB0:
serial_ioctl - cmd 0x540b
Apr 14 00:09:44 kali kernel: [14827.129706] tty ttyUSB0:
serial_ioctl - cmd 0x5401
Apr 14 00:09:44 kali kernel: [14827.129720] tty ttyUSB0:
serial_ioctl - cmd 0x5402
Apr 14 00:09:44 kali kernel: [14827.129733] tty ttyUSB0: serial_set_termios
Apr 14 00:09:44 kali kernel: [14827.129746] usb 1-1:
ch341_control_out(40,9a,1312,b202)
Apr 14 00:09:44 kali kernel: [14827.130559] ch341-uart ttyUSB0:
ch341_update_line_status - multiple status change
Apr 14 00:09:44 kali kernel: [14827.130570] ch341-uart ttyUSB0:
ch341_update_line_status - delta=0x02
Apr 14 00:09:44 kali kernel: [14827.130612] usb 1-1:
ch341_control_out(40,9a,0f2c,000c)
Apr 14 00:09:44 kali kernel: [14827.131589] usb 1-1:
ch341_control_out(40,a4,ff9f,0000)
Apr 14 00:09:44 kali kernel: [14827.132553] ch341-uart ttyUSB0:
ch341_update_line_status - multiple status change
Apr 14 00:09:44 kali kernel: [14827.132571] ch341-uart ttyUSB0:
ch341_update_line_status - delta=0x02
Apr 14 00:09:44 kali kernel: [14827.133388] tty ttyUSB0:
serial_ioctl - cmd 0x5401
Apr 14 00:09:44 kali kernel: [14827.133411] tty ttyUSB0:
serial_ioctl - cmd 0x540b
Apr 14 00:09:44 kali kernel: [14827.133427] tty ttyUSB0:
serial_ioctl - cmd 0x540b
Apr 14 00:09:44 kali kernel: [14827.133440] tty ttyUSB0:
serial_ioctl - cmd 0x540b
Apr 14 00:09:44 kali kernel: [14827.134087] tty ttyUSB0:
serial_write - 1 byte(s)
Apr 14 00:09:47 kali kernel: [14830.144091] tty ttyUSB0:
serial_write - 5 byte(s)
Apr 14 00:09:47 kali kernel: [14830.152441] ch341-uart ttyUSB0:
ch341_update_line_status - multiple status change
Apr 14 00:09:47 kali kernel: [14830.152452] ch341-uart ttyUSB0:
ch341_update_line_status - delta=0x01
Apr 14 00:09:47 kali kernel: [14830.154426] ch341-uart ttyUSB0:
ch341_update_line_status - multiple status change
Apr 14 00:09:47 kali kernel: [14830.154433] ch341-uart ttyUSB0:
ch341_update_line_status - delta=0x01
Apr 14 00:10:02 kali kernel: [14845.144415] tty ttyUSB0: serial_close
Apr 14 00:10:02 kali kernel: [14845.144432] tty ttyUSB0:
serial_chars_in_buffer
Apr 14 00:10:02 kali kernel: [14845.144442] tty ttyUSB0:
serial_wait_until_sent
Apr 14 00:10:02 kali kernel: [14845.147914] usb 1-1:
ch341_read_int_callback - urb shutting down: -2
Apr 14 00:10:02 kali kernel: [14845.149723] tty ttyUSB0: serial_cleanup
I think it's not the fault of QT ...
2014-04-13 21:14 GMT-04:30 Greg KH <[email protected]>:
> On Sun, Apr 13, 2014 at 08:51:56PM -0430, Kijam López wrote:
>> The following code works for me correctly in Windows, but Linux does
>> not work. I am using the same PC, both operating systems are installed
>> native. I do not use virtual machine. I need to work on Linux. I have
>> tried in different linux distributions and does not work anywhere.
>
> <snip>
>
> Sounds like a Qt issue, what is the status of the bug you filed with
> those developers?
>
> greg k-h
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html