Trouble writing serial port for React native windows c++ native module

82 Views Asked by At

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++

0

There are 0 best solutions below