Daniele Barzotti wrote:
Hi Igor, first thanks for your reply. I wrong to put a file the the zip. The one in attach should compile also with _USE_SERIAL_OK. But anyway...using that directive, the code use the mini_com client example found on the net and, of course, it works. So starting from this, I've substituted it with my Serial class and the write on COM is extremely slow. When I've said I've isolated the problem I would say that the issue is in my serial class wrapper (Serial.cpp) and not in the others classes.
Ok, I've found the problem. In SerialPort::Open() I've deleted the line: SetSerialDCS(&_dcs); which is : ------------------------------------------------------------- void SerialPort::SetSerialDCS(SerialDCS *DCS) { memcpy(&_dcs, DCS, sizeof(SerialDCS)); try { if (_serialPort.is_open()) { serial_port_base::baud_rate baud_option(_dcs.baud); _serialPort.set_option( baud_option ); serial_port_base::baud_rate flow_option(_dcs.flowcontrol); _serialPort.set_option( flow_option ); serial_port_base::baud_rate parity_option(_dcs.parity); _serialPort.set_option( parity_option ); serial_port_base::baud_rate stopbits_option(_dcs.stopbits); _serialPort.set_option( stopbits_option ); } } catch (...) {} }; ------------------------------------------------------------- And now the write works ok. But I've another issue on reading... My reading procedure is: SerialPort::read_start | | SerialPort::read_complete | | (Start an rx timer) | | SerialPort::Timer_Expired | | Raise the 'event' DataReveived Ok, if I put a breakpoint on one of these levels, all works and I see the data received, if I run the code without breakpoints the SerialPort::read_complete is not called. Follow the code... //------------------------------------------------------------ void SerialPort::Post_OnData() { // Raise the event std::cout << "SerialPort::Post_OnData" << std::endl; signal_OnData(); }; //------------------------------------------------------------ void SerialPort::timer_exipred(const boost::system::error_code& error) { if (!error) { std::cout << "SerialPort::timer_exipred" << std::endl; // Timer expired-> read completed, so process the data _io_service.post( boost::bind(&SerialPort::Post_OnData, this) ); } } //------------------------------------------------------------ void SerialPort::read_complete(const boost::system::error_code& error, size_t bytes_transferred) { // the asynchronous read operation has now completed or failed and returned an error if (!error) { std::cout << "SerialPort::read_complete" << std::endl; // saving data to vector _read_buffer.append(_buf, bytes_transferred); //Start a new timer //_rx_timer.expires_from_now( boost::posix_time::milliseconds(ReadTimeOut) ); _rx_timer.expires_from_now( boost::posix_time::milliseconds(50) ); // Start new asynchronous wait. _rx_timer.async_wait( boost::bind(&SerialPort::timer_exipred, this, _1) ); // start waiting for another asynchronous read again read_start(); } }; //------------------------------------------------------------ void SerialPort::read_start() { std::cout << "SerialPort::read_start" << std::endl; // Start an asynchronous read and call read_complete when it completes or fails _serialPort.async_read_some(boost::asio::buffer(_buf, m_buffer_size), boost::bind(&SerialPort::read_complete, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); }; //------------------------------------------------------------ Thanks, Daniele.