Skip to content

Instantly share code, notes, and snippets.

@Trass3r
Created December 5, 2017 14:50
Show Gist options
  • Select an option

  • Save Trass3r/63468a22c5f7dec060e3e0d950affe32 to your computer and use it in GitHub Desktop.

Select an option

Save Trass3r/63468a22c5f7dec060e3e0d950affe32 to your computer and use it in GitHub Desktop.
// C#:
// var serialPort = new SerialPort("COM7", 115200, Parity.None, 8, StopBits.One);
// serialPort.Open();
// Console.Write(serialPort.ReadChar());
// C++:
#include "clara.hpp"
#include <windows.h>
#include <cstdint>
#include <cstdio>
#include <iostream>
int main(int argc, char* argv[])
{
std::string portName = "COM7";
uint32_t baudrate = 115200;
uint32_t numBytesToRead = 1;
bool showHelp = false;
bool purgeComm = false;
{
using namespace clara;
auto cli
=
Help(showHelp)
+
Arg(portName, "port")
("ex. COM7")
+ Opt(baudrate, "baudrate")
["-b"]
("ex. 115200")
+ Opt(numBytesToRead, "numBytes")
["-n"]
("number of bytes to read")
+ Opt(purgeComm, "flush")
["-f"]
("flush port");
auto result = cli.parse(Args(argc, argv));
if (!result)
{
puts("Error in command line: ");
puts(result.errorMessage().c_str());
return 1;
}
if (/*argc < 2 ||*/ showHelp)
{
std::cout << cli;
return 0;
}
}
HANDLE port = CreateFileA(("\\\\.\\" + portName).c_str(), GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, 0, nullptr);
if (port == INVALID_HANDLE_VALUE)
{
printf("Could not open port %.*s!\n", portName.length(), portName.c_str());
return 2;
}
DCB dcbSerialParams = {};
dcbSerialParams.DCBlength = sizeof(DCB);
if (!GetCommState(port, &dcbSerialParams))
return 3;
dcbSerialParams.BaudRate = baudrate;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = 0;
dcbSerialParams.Parity = 0;
dcbSerialParams.fOutX = false;
dcbSerialParams.fInX = false;
dcbSerialParams.fOutxCtsFlow = false;
if (!SetCommState(port, &dcbSerialParams))
return 4;
COMMTIMEOUTS timeouts = {};
//timeouts.ReadIntervalTimeout = MAXDWORD;
timeouts.ReadTotalTimeoutConstant = 5000;
if (!SetCommTimeouts(port, &timeouts))
return 5;
if (purgeComm)
{
printf("flushing....\n");
if (!PurgeComm(port, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR))
{
printf("failed: %s\n", windowsErrorString().c_str());
}
}
std::vector<uint8_t> data(numBytesToRead, 0xCD);
DWORD dwRead;
printf("trying to read %d bytes...\n", numBytesToRead);
if (!ReadFile(port, data.data(), numBytesToRead, &dwRead, nullptr))
{
printf("error\n");
}
else
{
data.resize(dwRead);
printf("successfully read %d bytes:\n", dwRead);
for (uint8_t d : data)
printf("%02X ", d);
printf("\n");
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment