아래의 제품을 비롯한 NI 소프트웨어를 다운로드하시려면 ni.com/downloads를 방문하십시오.
IN 으로 배열 선언된 접점은 계속 읽어서 Serial 로 출력 합니다.
OUT 으로 배열 선언된 접점은 Serial Interrupt 를 통해 프로토콜 확인 후 출력합니다.
제어 명령은 2자리 Digital IO 와 _ 언더바, 세자리 On Off 커맨드로 이뤄 집니다. On 은 스페이스 넣어 주셔야 합니다.
응답은 특정 프로토콜에 맞춰 나오며, INPUT 접점도 마찬가지로 프로토콜에 맞춰 출력합니다.
명령 응답 STX + ADDR + DigitalIO + State +ETX +CR + LF
입력 응답 STX + ADDR + DigitalIO 의 상태값...... +ETX +CR +LF
추가로.. ChatGPT 틀린부분 정말 잘 찾네요. 사랑합니다 ChatGPT.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
// Constant
volatile bool state = false; // Default value is LOW
volatile int ch; // Default Channel No. is 13
volatile int interruptFlag = 0; // Interrupt Flag
void setup()
{
// put your setup code here, to run once:
// Open Serial port
Serial.begin (9600); // Baudrate
Serial.setTimeout (500); // Timeout
// IO Pinmap
const int IN[4] = {2,3,4,5};
const int OUT[36] = {6,7,8,9,10,14,15,16,17,18,19,20,21,22,23,24,25,26,29,30,31,32,33,34,35,36,39,40,41,42,43,44,45,46,47,48};
// pin0, pin1, pin13 are not use. Because pin0 and pin1 are Serial1 pin. and pin13 is connected Fulldown circuit.
// pin11, pin12, pin27, pin28, pin37, pin38, pin49, pin50, pin51, pin52, pin53 is SPARE pin.
const int LED = 13; // LED Test
pinMode(LED,OUTPUT);
// Set pinModes for INPUT pins
for (int i=0; i<4; i++)
{
pinMode(IN[i], INPUT);
}
// Set piModes for OUTPUT pins
for (int i=0; i<36; i++)
{
pinMode(OUT[i], OUTPUT);
}
// Protocol
const int STX = 0x02; // STX
const int ETX = 0x03; // ETX
const int ADDR = 0x01; // Address
const int CR = 0x0D; // Carriage Return
const int LF = 0x0A; // Line Feed
// Initialize InterruptFlag
interruptFlag = 0;
}
void loop()
{
// put your main code here, to run repeatedly:
// Read Digital Input State and Send Serial Message to PC
// make a message. STX(1) + ADDR(1) + Message(4) + ETX(1)
// IO Pinmap
const int IN[4] = {2,3,4,5};
const int OUT[36] = {6,7,8,9,10,14,15,16,17,18,19,20,21,22,23,24,25,26,29,30,31,32,33,34,35,36,39,40,41,42,43,44,45,46,47,48};
// pin0, pin1, pin13 are not use. Because pin0 and pin1 are Serial1 pin. and pin13 is connected Fulldown circuit.
// pin11, pin12, pin27, pin28, pin37, pin38, pin49, pin50, pin51, pin52, pin53 is SPARE pin.
// Protocol
const int STX = 0x02; // STX
const int ETX = 0x03; // ETX
const int ADDR = 0x01; // Address
const int CR = 0x0D; // Carriage Return
const int LF = 0x0A; // Line Feed
if (interruptFlag == 0)
{
Serial.write(STX);
Serial.write(ADDR);
for (int i=0; i<4; i++)
{
int rIN = IN[i];
Serial.print(digitalRead(rIN)?'1':'0');
}
Serial.write(ETX);
Serial.write(CR);
Serial.write(LF);
delay (100); // send message timming 100ms
}
if (interruptFlag == 1)
{
bool bstate = state;
int ich = ch;
if (bstate == true)
{
digitalWrite (ich,HIGH);
Serial.write (STX);
Serial.write (ADDR);
Serial.print (ich);
Serial.write ('1');
Serial.write (ETX);
Serial.write (CR);
Serial.write (LF);
}
if (bstate == false)
{
digitalWrite (ich,LOW);
Serial.write (STX);
Serial.write (ADDR);
Serial.print (ich);
Serial.write ('0');
Serial.write (ETX);
Serial.write (CR);
Serial.write (LF);
}
interruptFlag = 0;
}
// }
}
void serialEvent()
{
// Serial Interrupt Event.
if (Serial.available() >=6)
{
int dataSize = Serial.available(); // read Serial Data Size
String received = Serial.readString(); // read Serial Data
// received Serial Data is liked "16_Off".
String CH = received.substring(0,2); // 16
String State = received.substring(3,6); // Off
ch = CH.toInt(); // change volatile ch to int iCH
if (State.equals("On "))
{
state = true;
}
if (State.equals("Off")) // State is String.
{
state = false; // state is bool.
}
// InterruptFlag On
interruptFlag = 1;
}
}
Arduino Mega 2560 에 ino 파일 업로드 후 Serial 통신 예제로 통신 제어가 되는지 확인 합니다.
확인을 위해 13번 LED 가 OUTPUT으로 선언되어 있습니다.
How-Separate-2Arduino IDE
LabVIEW 2016
NI-VISA
Additional-Separate-2NI 커뮤니티에 있는 예제 코드 교환의 예제 코드는 MIT 라이센스로 라이센스가 부여됩니다.
응답과 관련해서 1자리 수 접점을 제어하면, 정의한 프로토콜에 맞춰 데이터가 안나옵니다.
제어하는데는 이상이 없습니다.
관련해서 코드를 업데이트 했는데, 편집을 할 수가 없네요.
몇줄 되지 않으니 추가 해 보시기 바랍니다.
indexOf 로 문자를 찾아 입력된 명령을 처리해 주시면 됩니다.
응답은 한자리 수 접점일 경우 '0' 을 추가 해 주시면 됩니다.