aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Vymetálek <pavel@vym.cz>2024-02-13 16:24:10 +0100
committerPavel Vymetálek <pavel@vym.cz>2024-02-13 16:24:10 +0100
commit863d5a8f3f80d5f0e78d77d5b72d260ed7a06215 (patch)
treedc7e2344ed89c23fe679800d2823e898dc26719d
parent6778bf79e6765bfb0e2a504d19dce971e43a6d49 (diff)
downloadsercp-pc-863d5a8f3f80d5f0e78d77d5b72d260ed7a06215.tar.gz
Flush serial reads data as long as there is any left
- fix length of received data with ACK message
-rw-r--r--sercp.c36
-rw-r--r--sercp.rc8
2 files changed, 31 insertions, 13 deletions
diff --git a/sercp.c b/sercp.c
index 9c8cf51..9607482 100644
--- a/sercp.c
+++ b/sercp.c
@@ -68,7 +68,7 @@
#define FALSE 0
#define true 1
#define TRUE 1
-const char* _version = "v0.4.0";
+const char* _version = "v0.8.0-pre1";
// SERIAL
FILE *tapout_fd = NULL;
int is_outfile = 0;
@@ -230,15 +230,27 @@ void TestArgs (int argc, char *argv[])
//*****************************************************************************
+// TODO read bytes from serial port for 200ms
void FlushSerialPort() {
-if (serial_fd) {
- sleep_ms(20);
+ ssize_t len = 0;
+ if (serial_fd) {
+ sleep_ms(20);
#ifdef _WIN32
+ unsigned long ulNumBytes = 0;
PurgeComm(serial_fd, PURGE_RXABORT| PURGE_TXABORT | PURGE_RXCLEAR | PURGE_TXCLEAR);
+ do {
+ sleep_ms(100);
+ ReadFile(serial_fd, p_buff, 100, &ulNumBytes, NULL);
+ len = (size_t) ulNumBytes;
+ } while (len > 1);
#else
tcflush(serial_fd, TCIOFLUSH);
- #endif
+ do {
+ sleep_ms(100);
+ len = read (serial_fd, p_buff, 100);
+ } while (len > 1);
+#endif
}
}
@@ -455,7 +467,7 @@ uint8_t WaitReadAck(void) {
unsigned long ulNumBytes =0;
while (1) {
sleep_ms(10);
- ReadFile(serial_fd, &buf_ack[len], 6, &ulNumBytes, NULL);
+ ReadFile(serial_fd, &buf_ack[len], sizeof(buf_ack)-len, &ulNumBytes, NULL);
len += (size_t) ulNumBytes;
if (len == 6) break;
}
@@ -473,7 +485,7 @@ uint8_t WaitReadAck(void) {
CloseSerialPort();
exit(EXIT_FAILURE);
} else if (result) {
- len += read (serial_fd, &buf_ack[len], 6);
+ len += read (serial_fd, &buf_ack[len], sizeof(buf_ack)-len);
if (len == 6) {
break;
}
@@ -503,6 +515,10 @@ void RecvAckFileinfo(void) {
if (WaitReadAck() == 6) {
if (CheckAckSum()) {
printf("\nErr Ack fileinfo\n");
+ for (int x=0; x<6; x++) {
+ printf("%2X ",buf_ack[x]);
+ }
+ printf ("\n");
exit(-1);
};
};
@@ -514,6 +530,10 @@ void RecvAckBlock(uint8_t block_number) {
if (WaitReadAck() == 6) {
if (CheckAckSum() || (buf_ack[3] != block_number)) {
printf("\nErr ACK block\n");
+ for (int x=0; x<6; x++) {
+ printf("%2X ",buf_ack[x]);
+ }
+ printf ("\n");
exit(-1);
}
}
@@ -849,7 +869,6 @@ int OpenUart() {
if (SetCommTimeouts(serial_fd, &sCommTimeouts) == 0) {
return (-1);
}
- FlushSerialPort();
return (0);
#else
struct termios oldtio, newtio;
@@ -939,7 +958,6 @@ int OpenUart() {
newtio.c_cc[VTIME] = 1; // time to wait
tcsetattr(serial_fd, TCSANOW, &newtio);
sleep_ms(20);
- tcflush(serial_fd, TCIOFLUSH);
return 0;
#endif
}
@@ -963,7 +981,7 @@ int main(int argc, char** argv, char** env)
printf ("Can't open serial port\n");
exit (EXIT_FAILURE);
}
- FlushSerialPort();
+ FlushSerialPort(); // make the input fifo empty
#ifndef _WIN32
spolfd_serial[0].fd = serial_fd; // watching descriptor
spolfd_serial[0].events = POLLIN; // watch data on input
diff --git a/sercp.rc b/sercp.rc
index 1d13589..9828022 100644
--- a/sercp.rc
+++ b/sercp.rc
@@ -1,8 +1,8 @@
// RC file, codepage utf-8!
#include <windows.h> // include for version info constants
1 VERSIONINFO
-FILEVERSION 0,4,0,0
-PRODUCTVERSION 0,4,0,0
+FILEVERSION 0,8,0,0
+PRODUCTVERSION 0,8,0,0
FILETYPE VFT_APP
{
BLOCK "StringFileInfo"
@@ -10,14 +10,14 @@ FILETYPE VFT_APP
BLOCK "040904E4"
{
VALUE "CompanyName", "vym.cz"
- VALUE "FileVersion", "0.4.0"
+ VALUE "FileVersion", "0.8.0"
VALUE "FileDescription", "sercp - serial copy for ZX Spectrum"
VALUE "InternalName", "sercp"
VALUE "LegalCopyright", "GNU GPL v3 or above"
VALUE "LegalTrademarks", "Pavel Vymetálek"
VALUE "OriginalFilename", "sercp"
VALUE "ProductName", "sercp"
- VALUE "ProductVersion", "0.4.0"
+ VALUE "ProductVersion", "0.8.0-pre1"
VALUE "Build environment", "Linux: Mingw64, x86_64"
}
}