我正在尝试接口(1)LinkSprite JPEG彩色摄像机TTL接口 - 红外线和(2)Arduino Mega 2560连接到我的笔记本电脑。虽然我能够打印图像的十六进制值,但将1张图像打印到显示器大约需要30秒。我以为是因为我使用的是SoftwareSerial,所以我尝试了HardwareSerial,但每张图片仍然是30秒。使用HardwareSerial不应该更快吗?只是想知道,我需要一根连接arduino和笔记本电脑的特殊电缆吗?
我为Serial和Serial1尝试了不同的波特率组合。 (Serial.begin(9600),Serial1.begin(38400)),(Serial.begin(38400),Serial1.begin(38400))等...当我将Serial1设置为高于38400时,这不起作用。(它应该能够更高..)另外,我是否需要将波特率提高一定的间隔,即9600,19200,38400,57600,74880,115200,230400,250000?
#include <SoftwareSerial.h>
byte incomingbyte;
//Configure pin 2 and 3 as soft serial port
//SoftwareSerial Serial1 = SoftwareSerial(2, 3);
int a=0x0000, //Read Starting address
j=0,
k=0,
count=0;
uint8_t MH,ML;
boolean EndFlag=0;
void setup() {
Serial.begin(115200);
Serial1.begin(38400); //made changes in ChangeBaudRate()
ChangeBaudRate();[enter image description here][1]
SendResetCmd();
delay(3000);
}
void loop() {
SendTakePhotoCmd();
Serial.println("Start pic");
delay(100);
while(Serial1.available()>0) {
incomingbyte=Serial1.read();
}
byte b[32];
while(!EndFlag) {
j=0;
k=0;
count=0;
SendReadDataCmd();
delay(75); //try going up
while(Serial1.available()>0) {
incomingbyte=Serial1.read();
k++;
if((k>5)&&(j<32)&&(!EndFlag)) {
b[j]=incomingbyte;
if((b[j-1]==0xFF)&&(b[j]==0xD9))
EndFlag=1;
j++;
count++;
}
}
for(j=0;j<count;j++) {
if(b[j]<0x10)
Serial.print("0");
Serial.print(b[j], HEX);
}
Serial.println();
}
delay(3000);
StopTakePhotoCmd(); //stop this picture so another one can be taken
EndFlag = 0; //reset flag to allow another picture to be read
Serial.println("End of pic");
Serial.println();
while(1);
}
//Send Reset command
void SendResetCmd() {
Serial1.write((byte)0x56);
Serial1.write((byte)0x00);
Serial1.write((byte)0x26);
Serial1.write((byte)0x00);
}
//Send take picture command
void SendTakePhotoCmd() {
Serial1.write((byte)0x56);
Serial1.write((byte)0x00);
Serial1.write((byte)0x36);
Serial1.write((byte)0x01);
Serial1.write((byte)0x00);
a = 0x0000; //reset so that another picture can taken
}
void FrameSize() {
Serial1.write((byte)0x56);
Serial1.write((byte)0x00);
Serial1.write((byte)0x34);
Serial1.write((byte)0x01);
Serial1.write((byte)0x00);
}
//Read data
void SendReadDataCmd() {
MH=a/0x100;
ML=a%0x100;
Serial1.write((byte)0x56);
Serial1.write((byte)0x00);
Serial1.write((byte)0x32);
Serial1.write((byte)0x0c);
Serial1.write((byte)0x00);
Serial1.write((byte)0x0a);
Serial1.write((byte)0x00);
Serial1.write((byte)0x00);
Serial1.write((byte)MH);
Serial1.write((byte)ML);
Serial1.write((byte)0x00);
Serial1.write((byte)0x00);
Serial1.write((byte)0x00);
Serial1.write((byte)0x20);
Serial1.write((byte)0x00);
Serial1.write((byte)0x0a);
a+=0x20;
}
void StopTakePhotoCmd() {
Serial1.write((byte)0x56);
Serial1.write((byte)0x00);
Serial1.write((byte)0x36);
Serial1.write((byte)0x01);
Serial1.write((byte)0x03);
}
void ChangeBaudRate(){
Serial1.write((byte)0x56);
Serial1.write((byte)0x00);
Serial1.write((byte)0x24);
Serial1.write((byte)0x03);
Serial1.write((byte)0x01);
Serial1.write((byte)0x0D); // 115200 = 0x0D 0xA6
Serial1.write((byte)0xA6);
Serial1.end(); // Not really necessary
Serial1.begin( 115200 ); // change to match the camera's new baud rate
}
答案 0 :(得分:0)
是的,Arduino和相机之间的波特率是决定因素。 Arduino和PC之间的波特率(即串行监视器窗口)是9600,但您可以在代码Serial.begin(115200);
和串行监视器窗口(角落中的下拉)中将其更改为115200。
Arduino和摄像机之间的默认波特率是38400.在波特率下,您可以发送&#34;更改波特率&#34;命令(spec的第6/10页第9节)。这似乎是这个例程的目的:
void ChangeBaudRate(){
Serial1.write((byte)0x56);
Serial1.write((byte)0x00);
Serial1.write((byte)0x24);
Serial1.write((byte)0x03);
Serial1.write((byte)0x01);
Serial1.write((byte)0x1c);
Serial1.write((byte)0x4c);
}
根据规范,这将新波特率设置为57600.您可以通过将最后两个字节更改为0x0D和0xA6来选择115200。 然后您必须将Serial1
设置为新的波特率:
void ChangeBaudRate(){
Serial1.write((byte)0x56);
Serial1.write((byte)0x00);
Serial1.write((byte)0x24);
Serial1.write((byte)0x03);
Serial1.write((byte)0x01);
Serial1.write((byte)0x0D); // 115200 = 0x0D 0xA6
Serial1.write((byte)0xA6);
Serial1.end(); // Not really necessary
Serial1.begin( 115200 ); // change to match the camera's new baud rate
}