This is my first time writing in C++ and using UWP. Currently, im having issues writing serial port in C++, it works fine with C# using System.IO.Ports. But with C++, there's alot of difference.
I'm currently getting error "[Error: Promise destroyed.]" with Async i assume because of "devices.Completed(...)".
How can I solve this issue?
CPP Native Module
#pragma once
#include "JSValue.h"
#include "NativeModules.h"
#include <iostream>
#include <Windows.h>
#include <winrt/Windows.Devices.SerialCommunication.h>
#include <winrt/Windows.Devices.Enumeration.h>
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Foundation.Collections.h>
using namespace winrt;
using namespace winrt::Windows::Devices::SerialCommunication;
using namespace winrt::Windows::Devices::Enumeration;
using namespace winrt::Windows::Foundation;
using namespace winrt::Microsoft::ReactNative;
namespace winrt::ReactNativeSerial
{
REACT_MODULE(ReactNativeModule)
struct ReactNativeModule
{
REACT_INIT(Initialize)
void Initialize(ReactContext const& reactContext) noexcept
{
m_reactContext = reactContext;
}
REACT_METHOD(sampleMethod)
void sampleMethod(std::string stringArgument, int numberArgument, std::function<void(std::string)>&& callback) noexcept
{
// TODO: Implement some actually useful functionality
callback("Received numberArgument: " + std::to_string(numberArgument) + " stringArgument: " + stringArgument);
}
REACT_METHOD(connectSerial)
void connectSerial(hstring& const portName, ReactPromise<void> promise) noexcept
{
try {
auto aqs = SerialDevice::GetDeviceSelector(portName);
IAsyncOperation<DeviceInformationCollection> devices = DeviceInformation::FindAllAsync(aqs);
devices.Completed([&](IAsyncOperation<DeviceInformationCollection> const& operation, AsyncStatus status) {
if (status == AsyncStatus::Completed)
{
DeviceInformationCollection deviceCollection = operation.GetResults();
if (deviceCollection.Size() > 0)
{
DeviceInformation deviceInfo = deviceCollection.GetAt(0);
serialDevice = SerialDevice::FromIdAsync(deviceInfo.Id()).get();
if (serialDevice)
{
serialDevice.BaudRate(9600);
serialDevice.DataBits(8);
serialDevice.Parity(SerialParity::None);
serialDevice.StopBits(SerialStopBitCount::One);
promise.Resolve();
}
else
{
promise.Reject(L"Failed to open serial port");
}
}
else
{
promise.Reject(L"No serial devices found");
}
}
else
{
promise.Reject(L"Failed to retrieve device information");
}
});
}
catch (winrt::hresult_error const& ex) {
promise.Reject(ex.message().c_str());
}
catch (...) {
promise.Reject(L"Something went wrong...");
}
}
REACT_METHOD(closeSerial)
void closeSerial(ReactPromise<void> promise) noexcept
{
serialDevice.Close();
promise.Resolve();
}
private:
ReactContext m_reactContext{ nullptr };
SerialDevice serialDevice{ nullptr };
};
} // namespace winrt::ReactNativeSerial
React Native Code
ReactNativeModule.connectSerial("COM4").then((d: any) => console.log(d)).catch((error: any) => console.log(error));
I expect to get connection established with Serial Communication and able to readline from the connection using C++